什么是XSS
英文全称:Cross‑Site Script,为了和CSS(层叠样式表)区分,缩写命名为 XSS。
攻击常发生在允许输入HTML内容的位置:评论区、CMS投稿、用户留言等。
黑客以普通用户身份,提交包含恶意JS脚本的HTML代码。其他用户访问页面时,恶意脚本会在浏览者浏览器中执行。
典型危害:
脚本可以读取当前用户的Cookie,并把Cookie发送给黑客。黑客拿到Cookie即可冒充账号登录;如果窃取到管理员Cookie,就可以获取网站管理员权限。
早期XSS案例大多是跨域场景,因此叫“跨站脚本”;现在即使不跨域,也可以实施攻击,但XSS名称保留沿用。
XSS两种常见类型
- 反射型XSS
恶意代码放在URL参数里,请求触发后直接在页面输出,不会存入数据库,需要诱导用户点击恶意链接才会触发。 - 存储型XSS
恶意脚本提交后保存到数据库(评论、投稿),所有访问该页面的用户都会触发脚本,危害更大。
ASP.NET WebForm 反射型XSS演示示例
页面 WebForm1.aspx
<body>
<form id="form1" runat="server">
<div>
<asp:Literal ID="Literal1" runat="server"></asp:Literal>
</div>
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</div>
</form>
</body>Code language: HTML, XML (xml)
后端按钮事件,直接把用户输入原样输出到页面,就会产生XSS漏洞:
protected void Button1_Click(object sender, EventArgs e)
{
//漏洞:直接把用户输入渲染为HTML
Literal1.Text = TextBox1.Text;
}Code language: JavaScript (javascript)
用户输入:
<script>alert('XSS攻击')</script>,提交后脚本直接执行。
XSS 解决方案
- 输入过滤(保存数据库之前处理)
过滤危险标签与事件:
- JS事件:
onclick、onload、onmouseover - 危险属性:
style、expression、background:url(javascript:...)等,清除可执行JS的代码。
- 使用UBB编辑器
不直接保存HTML,转成UBB标记语法。只保留安全排版功能,自动禁用JS事件、危险脚本。 - 业务上尽量不要开放HTML输入权限
如CMS投稿、评论模块,非必要不要支持完整HTML。 - 输出编码(重要)
把用户输出内容做HTML编码,<>"'转义成实体字符,浏览器只会当成普通文本展示,不会解析执行脚本。
配合Cookie设置HttpOnly=true,就算XSS漏洞出现,JS脚本也无法读取Cookie,降低损失。
Previous: Cookie的安全问题
Next: DoS攻击与DDoS攻击