假如項目在前期沒有過濾客戶提交的字符,那么可以在輸出的時候,對輸出的字符進行過濾,防止出現XSS跨域攻擊。
原理簡單:利用ASP.NET API的管道原理,在MessageHandlers中添加一個自定義的處理環節。
好了,源代碼如下:
public class MessageFilterOutputHandler : MessageHandler { protected override async Task OutgoingMessageAsync(HttpResponseMessage message) { var ps = await message.Content.ReadAsStringAsync(); ps = AntiXssEncoder.HtmlEncode(ps, false); message.Content = new StringContent(ps); } } public abstract class MessageHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); await OutgoingMessageAsync(response); return response; } protected abstract Task OutgoingMessageAsync(HttpResponseMessage message); }
其中,OutgoingMessageAsync方法中,利用了微軟的AntiXss類庫,防止輸出:<script>,<iframe>等敏感字符。
另外,Global文件中,在Application_Start方法中添加,對MessageFilterOutputHandler的調用。
GlobalConfiguration.Configuration.MessageHandlers.Add(new MessageFilterOutputHandler());