原文地址:Web 漏洞分析与防护之 XSS(一)
博客地址:www.extlight.comhtml
跨站脚本攻击(Cross Site Scripting)前端
经过在网站中的输入框写入 script 脚本或引入 script 文件,若是网站未过滤输入内容,将会解析该脚本。git
若是脚本的功能是获取网站的 cookie,cookie 中又保留一些敏感信息,则后果有可能很严重。github
反射型攻击:脚本看成 url 的参数进行注入执行浏览器
存储型攻击:脚本被存储到 DB 后,读取时被解析执行bash
页面代码:cookie
<div>${content}</div>复制代码
content 的内容为 <script>alert(1)</script>,脚本攻击后,会变成:xss
<div><script>alert(1)</script></div>复制代码
页面将会执行 alert(1)。工具
页面代码:网站
<img src="${imgSrc}" />复制代码
imgSrc 的内容为 2" onerror="alert(2),脚本攻击后,会变成:
<img src="2" onerror="alert(2)" />复制代码
页面将会执行 alert(2)。
<script>
var mydata = "${data}";
</script>复制代码
data 的内容为 hello";alert(3);",脚本攻击后,会变成:
<script>
var mydata = "hello";alert(3);"";
</script>复制代码
页面将会执行 alert(3)。
富文本须要保留 HTML 文本,HTML 文本中就有 XSS 攻击的风险。
浏览器自带一些防护能力,但只能防护 XSS 反射类型攻击,且只能防护上文描述的前二个注入点。
防护手段原理也很简单,就是将可能会执行脚本的标签或属性进行转义和过滤。
将 < 和 > 转义成 <; 和 >;。
将 " 转义成 &quto;。
将 " 转义成 \“ 。
使用白名单保留部分标签和属性。
须要前端第三方工具:cheerio。
案例:
function xssFilter(html) {
var cheerio = require("cheerio");
var $ = cheerio.load(html);
// 白名单列表,key:标签,value:属性
var whiteList = {
"img":["src"],
"a":["href"],
"font":["color","size"]
};
// html 的遍历全部元素
$("*").each(function(index,elem) {
// 删除不在白名单的标签
if (!whiteList[elem.name]) {
$(elem).remove();
return;
}
// 删除不在白名单的标签的属性
for (var attr in elem.attribs) {
if (whiteList[elem.name].indexOf(attr) == -1) {
$(elem).attr(attr,null);
return;
}
}
});
return $.html();
}复制代码
还有另外一种第三方工具,名字就叫 xss