web-dev-qa-db-fra.com

Ajout de l'en-tête X-Frame-Options à toutes les pages de l'application MVC 4

J'essaie d'ajouter l'en-tête X-Frame-Options (avec une valeur définie sur "DENY") dans mon application MVC 4. J'ai regardé autour de moi et il semble this est le moyen le plus propre d'ajouter pour toutes les pages.

Cependant, lorsque j'ajoute ce code, il ne se construit pas. Avec une erreur sur OnResultExecuting de

"aucune méthode appropriée n'a été trouvée pour remplacer."

public class XframeOptions : ActionFilterAttribute
{
    public override void OnResultExecuting(
          System.Web.Mvc.ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.AddHeader(
            "X-Frame-Options", "DENY");
    }
}

Si c'est le moyen le plus propre de le faire, comment puis-je résoudre cette erreur? Existe-t-il une meilleure façon de gérer cela dans une application MVC 4?

40
Xaxum

Assurez-vous que vous héritez de correct class :

public class XframeOptions : System.Web.Mvc.ActionFilterAttribute

Dans ASP.NET MVC 4, il y a l'API Web qui a un espace de noms différent et puisque vous n'avez pas explicitement spécifié l'espace de noms, je suppose que le compilateur choisit la mauvaise classe:

System.Web.Http.Filters.ActionFilterAttribute
14
Darin Dimitrov

Il n'est pas nécessaire d'avoir un HttpModule ou un ActionFilter personnalisé si vous en avez besoin pour chaque page. https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options détaille une solution beaucoup plus simple:

Pour configurer IIS pour envoyer l'en-tête X-Frame-Options, ajoutez le fichier Web.config de votre site:

<system.webServer>
  ...

  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>

  ...
</system.webServer>
124
robrich

Il existe une autre façon de procéder. créer un HttpModule personnalisé comme ci-dessous:

    public class XframeOptionsModule : IHttpModule
{
    public void Dispose()
    {

    }

    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += this.OnPreSendRequestHeaders;
    }
    private void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("x-frame-options", "Deny");
    }
}

puis enregistrez ce module dans web.config

    <modules >
        <add name ="XframeOptions" type="your module's full type info"/>
    </modules>
6
shimron

Vous obtenez cette erreur car vous utilisez un nom de méthode incorrect au lieu de OnResultExecuting utilisez OnResultExecuted. Vous devez écrire votre méthode comme ceci:

public class XframeOptionsFilter : System.Web.Mvc.ActionFilterAttribute
{
    public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.AddHeader("x-frame-options", "Deny");
    }
}
4
Vikas Kumar

NWebsec vous permet de définir ceci et d'autres en-têtes de sécurité via web.config, le middleware OWIN et/ou les attributs de filtre MVC: https://github.com/NWebsec/NWebsec/wiki

Avertissement: je suis le responsable du projet.

1
klings

Pour ajouter un en-tête deny "x-frame-options" à toutes les applications MVC, vous pouvez procéder comme suit pour éviter une attaque Clickjacking.

using System;
using System.Web;

namespace Demo.Website.Modules
{
    public class XfoHeaderModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += ContextPreSendRequestHeaders;
        }

        public void Dispose()
        {
        }

        private void ContextPreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Headers.Add("X-Frame-Options", "Deny");
        }
    }
}

Ajoutez ce qui suit au web.config

  <system.webServer>
    <modules>
      <add name="XfoHeader" type="Demo.Website.Modules.XfoHeaderModule" />
    </modules>
  </system.webServer>

enter image description here

0
Diganta Kumar