参考 www.jianshu.com/p/2d9da4490…javascript
XSS攻击一般指的是经过利用网页开发时留下的漏洞,经过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序一般是JavaScript,但实际上也能够包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能获得包括但不限于更高的权限(如执行一些操做)、私密网页内容、会话和cookie等各类内容。java
HTML是一种超文本标记语言,经过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看做是HTML标签的开始,
<input type="text" value="<%= escapeHTML(getParameter("keyword")) %>">
<button>搜索</button>
<div>
您搜索的关键词是:<%= escapeHTML(getParameter("keyword")) %>
</div>
复制代码
通过了转义函数的处理后,最终浏览器接收到的响应为:浏览器
<input type="text" value=""><script>alert('XSS');</script>">
<button>搜索</button>
<div>
您搜索的关键词是:"><script>alert('XSS');</script>
</div>
复制代码
<a href="<%= escapeHTML(getParameter("redirect_to")) %>">跳转...</a>
复制代码
这段代码,当攻击 URL 为http://xxx/?redirect_to=javascript:alert('XSS'),服务端响应就成了:安全
<a href="javascript:alert('XSS')">跳转...</a>
复制代码
虽然代码不会当即执行,但一旦用户点击 a 标签时,浏览器会就会弹出“XSS”。bash
// 根据项目状况进行过滤,禁止掉 "javascript:" 连接、非法 scheme 等
allowSchemes = ["http", "https"];
valid = isValid(getParameter("redirect_to"), allowSchemes);
if (valid) {
<a href="<%= escapeHTML(getParameter("redirect_to"))%>">
跳转...
</a>
} else {
<a href="/404">
跳转...
</a>
}
复制代码
把一个数据经过 JSON 的方式内联到 HTML 中:cookie
<script>
var initData = <%= data.toJSON() %>
</script>
复制代码
插入 JSON 的地方不能使用 escapeHTML(),由于转义 " 后,JSON 格式会被破坏。 但安全组又发现有漏洞,原来这样内联 JSON 也是不安全的:函数
因而咱们又要实现一个 escapeEmbedJSON() 函数,对内联 JSON 进行转义。 转义规则以下:ui
修复后的代码以下:url
<script>
var initData = <%= escapeEmbedJSON(data.toJSON()) %>
复制代码
总之,若是开发者没有将用户输入的文本进行合适的过滤,就贸然插入到 HTML 中,这很容易形成注入漏洞。攻击者能够利用漏洞,构造出恶意的代码指令,进而利用恶意代码危害数据安全。
插入 JSON 的地方不能使用 escapeHTML(),由于转义 " 后,JSON 格式会被破坏。 但安全组又发现有漏洞,原来这样内联 JSON 也是不安全的:
当 JSON 中包含 U+2028 或 U+2029 这两个字符时,不能做为 JavaScript 的字面量使用,不然会抛出语法错误。 当 JSON 中包含字符串 时,当前的 script 标签将会被闭合,后面的字符串内容浏览器会按照 HTML 进行解析;经过增长下一个