什么是 XSS 攻击?

XSS(Cross Site Scripting,跨站脚本攻击)

恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

XSS 攻击的原理

我们可以通过例子来感受一下它的原理。XSS game: Level 1 这个网站是让我们了解 XSS 攻击的小游戏,看看他设计的第一关。 在搜索框中输入文字,再点击 Search 按钮后。浏览器会向服务器发送 GET 请求

当服务器收到请求后会如何处理呢?在后面给我们展示的服务器端的 Python 源代码,不需具体理解这段代码具体做了什么,但注意到当中有下面这么几行代码。

message = "Sorry, no results were found for <b>" + query + "</b>."
message += " <a href='?'>Try again</a>."
 # Display the results page
self.render_string(page_header + message + page_footer)

服务器在接收到 query 的值后,会通过字符串拼接的方法将接收到的query的值与 前面定义好 HTML 模板的字符串(page_headerpage_footer)拼接,最后返回给浏览器。我们可以看看返回的 HTML

在这之前一切都还没有任何问题。但是,当有一个用户输的是:「<script>恶意代码</script>」时这里面的恶意代码就会被浏览器解析并执行。那么坏人们就可以通过这种方式来运行恶意代码了。

总结 XSS 的成因

  • 后台模板问题:后台输出代码的时候没有将可疑的符号(如 <,>,&等)转换成 HTML 编码,没有任何过滤而直接输出,形成 XSS 漏洞。

  • 前端代码问题:前端使用 innerHtml 等方式插入字符,如果插入的是 HTML 标签,客户端会直接执行。还有 eval 也可能导致同样的问题,也是我们需要避免使用的。

XSS 防御

  • 对于一切用户的输入、输出、客户端的输出内容视为不可信,在数据添加到 DOM 或者执行了DOM API 的时候,我们需要对内容进行 HtmlEncode 或 JavaScriptEncode ,以预防XSS攻击。
  • 除此之外,还可以通过对 cookie 进行较强的控制,比如对敏感的 cookie 增加 http-only 限制,让 JS 获取不到 cookie 的内容。

参考链接