XSS(跨站脚本攻击)
描述:
原理:攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到攻击用户的特殊目的。
类别:
1)被动注入(Passive Injection)。用户将恶意代码输入到表单中,保存到数据库,然后再显示在网站上;
2)主动注入(Active Injection)。用户将恶意代码输入到文本框中并将输入的内容立刻在屏幕上显示出来。
XSS攻击在Web上排名第一,遗憾的是,导致XSS猖獗的原因是Web开发人员不熟悉这种攻击(好遗憾哦。。。)。
避免:
1)对所有内容都进行HTML编码;
Razor引擎默认对输出内容进行HTML编码。如:@Model.FirstName。
如果非Razor引擎,则如:
<% Html.Encode(Model.FirstName) %>
2)使用Html.AttributeEncode和Url.Encode;
如
<a href=”<%= Url.Action(“Index”,"home”,new { name = ViewData[“name”]})%>">点击我</a>
将name改为:
"></a><script src = “http://abcd.evil.com”></script><a href= "
,则攻击成功。
编码1:
<a href=”<%= Url.Action(“Index”,”home”,new { name = Html.AttributeEncode(ViewData[“name”])})%>”>点击我</a>
编码2:
<a href=”<%= Url.Encode(Url.Action(“Index”,”home”,new { name = ViewData[“name”] }))%>”>点击我</a>
3)对Ajax.JavaScriptStringEncode进行JavaScript编码。
如
var searchItem = “@Html.Raw(Ajax. JavaScriptStringEncode(Model))”;
4)将AntiXss库作为ASP.NET的默认编码器。
反模式:
1)使用
Html.Raw(Model.ReturnUrl)
绕过编码;
2)使用
[AllowHtml]
对模型的属性禁用请求验证;
3)使用
[ValidateInput(false)]
对Controller或者Action禁用请求验证。