【问题标题】:Clickjacking proof under Asp.net5 MVC6?Asp.net 5 MVC 6 下的点击劫持证明?
【发布时间】:2016-05-11 10:51:54
【问题描述】:

在我总是添加之前添加 name="X-Frame-Options" value="DENY" 或 "SAMEORIGIN" 在 Web.config 中的 CustomHeaders 下,但是没有了。知道如何做这个 asp5 mvc6 吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-core-mvc clickjacking


    【解决方案1】:

    Web.config 没有消失。它已从项目根目录移至/wwwroot 文件夹。 IIS 仍然依赖于这些设置,包括您提到的X-Frame-Options 设置,它适用于所有请求,而不仅仅是那些传递给 MVC 的请求。但是,如果您不打算在 IIS 下托管您的应用程序,您可能需要找到一种不同的方法来启用这些设置。

    我刚刚测试并验证了将此部分放入 /wwwroot/web.config 文件中会在 IIS express 上添加标头。

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

    【讨论】:

    • 那么,不使用IIS怎么办?可以直接运行 Kestrel 或例如运行 Kestrel。在 Mac 或 Linux 上。
    • 我建议在 Kestrel(或您计划使用的其他 Web 服务器)上查找有关如何添加标头的文档,因为这是 Web 服务器配置的一部分,与 MVC 或 ASP 无关.NET。
    • 我认为除了中间件之外,您无法在 Kestrel 中以其他方式做到这一点,除非您自己在每个操作中增加响应 :)
    【解决方案2】:

    我认为选项取决于您的环境,如果您使用 IIS,那么您可以使用 NightOwl 的答案并在 web.config 中修复它,这也适用于 Azure,因为 Kestrel 在 IIS 后面运行。否则我认为您需要添加自定义中间件,该中间件会将这个标头添加到响应中(或者可能一些现有的中间件可以做到这一点,但我不知道......)

    【讨论】:

      【解决方案3】:

      如果你想同时兼容 IIS 和 Kestrel(以及 Linux),你显然不能使用 config.您将不得不使用中间件。在您的中间件中,您可以将 context.Response.OnStarting() 委托挂钩到您的 Invoke() method 中。

      例如,Exception middleware 就是这样做的,因此您可以像这样复制该模式(用 cmets 编码,而不是 VS)

      public class SetHeadersMiddleware
      {
          private readonly RequestDelegate _next;
          private readonly SetHandlersMiddlewareOptions _options;
          private readonly ILogger _logger;
          private readonly Func<object, Task> _setHeadersDelegate;
          private readonly DiagnosticSource _diagnosticSource;
      
          public SetHeadersHandlerMiddleware(
              RequestDelegate next, 
              ILoggerFactory loggerFactory, 
              IOptions<SetHandlersMiddlewareOptions> options,
              DiagnosticSource diagnosticSource)
          {
              _next = next;
              _options = options.Value;
              _logger = loggerFactory.CreateLogger<SetHeadersMiddleware>();
              _setHeadersDelegate= MessWithHeaders;
              _diagnosticSource = diagnosticSource;
          }
      
          public async Task Invoke(HttpContext context) 
          { 
              context.Response.OnStarting(_setHeadersDelegate, context.Response);
              await _next(context);
          }
      
          private Task MessWithHeaders(object state) 
          { 
              var response = (HttpResponse)state; 
      
              // Manipulate response.Headers here
      
              return Task.FromResult(0); 
          } 
      }
      

      【讨论】:

        【解决方案4】:

        因此,如果您使用的是 IIS,则接受的答案是正确的。如果您直接使用 Kestrel(甚至是 NGINX),那么它将无法正常工作。 .net core 的一部分优点在于跨平台!

        取自这里:http://dotnetcoretutorials.com/2017/01/08/set-x-frame-options-asp-net-core/

        要设置 X-FRAME-OPTIONS 或实际上任何其他标头,您只需要在 startup.cs 的 Configure 方法中具有类似于以下内容的内容

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.UseMvc();
        
            app.Use(async (context, next) =>
            {
                context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
                await next();
            });
        }
        

        如果您需要在特定的 Web 服务器(例如 Apache、NGinx 等)上执行此操作,则只需搜索如何为该特定服务器添加自定义标头。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          相关资源
          最近更新 更多