从ASP.NET Core前缀所有JSON响应以防止XSSI攻击

时间:2017-05-30 16:04:45

标签: asp.net-core

我想使用众所周知的字符串var mobile = /iPad|iPhone|iPod|android/.test(navigator.userAgent) && !window.MSStream; if (mobile) { $('body').on('touchstart click doubleclick keydown', function() { $("audio[autoplay='autoplay']").each( function(){ this.play(); this.removeAttribute('autoplay'); }); }); } 为ASP.NET Core中的所有JSON响应添加前缀,以防止XSSI攻击。 (有关详细信息,请参阅https://angular.io/docs/ts/latest/guide/security.html#!#xss。)

如何实现这一目标?我想我应该使用过滤器或中间件,但不能完全找到正确的方法。

2 个答案:

答案 0 :(得分:3)

是的,可以使用中间件或类似下面的过滤器:

public class EditResponseFilter : Attribute, IAsyncResourceFilter
{
    private const string _prefix = ")]}',\n";

    public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
    {
        var originBody = context.HttpContext.Response.Body;

        var newBody = new MemoryStream();

        //Body replacement is needed to make the response stream readable
        context.HttpContext.Response.Body = newBody;

        await next();

        newBody.Seek(0, SeekOrigin.Begin);

        string json = new StreamReader(newBody).ReadToEnd();

        context.HttpContext.Response.Body = originBody;

        await context.HttpContext.Response.WriteAsync(_prefix + json);
    }
}

答案 1 :(得分:0)

我希望有一个类似的东西,而不必在返回Json的api动作方法上放置属性。有没有办法检测我们是否返回json响应并放置前缀(或后缀)?