在Asp.net5 MVC6下点击劫持证据?

时间:2016-02-02 14:56:58

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

在我总是添加add name =" X-Frame-Options"值=" DENY"或" SAMEORIGIN" 在Web.config中的CustomHeaders下,但已经消失了。不知道怎么做这个asp5 mvc6?

4 个答案:

答案 0 :(得分:4)

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>

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

例如,Exception middleware执行此操作,因此您可以像这样复制该模式(在注释中编码,而不是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); 
    } 
}

答案 3 :(得分:0)

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

从这里采取: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等)上执行此操作,那么只需搜索如何为该特定服务器添加自定义标头。