Cross Site Scriping
跨站脚本攻击
url 参数中携带 'script', 比如:https://www.host.com/?q=https://www.baidu.com/test.js
- 获取页面数据
- 获取 Cookies
- 劫持前端逻辑
- 发送请求
- 偷取网站任意资料
- 偷取用户资料
- 偷取用户密码和登录态
- 欺骗用户
- ......
- 反射型: url 参数直接注入
- 存储型: 存储到 DB 后读取时注入
- HTML 节点内容
- HTML 属性
- JS 代码
- 富文本
富文本:
- 富文本的保留 HTML
- HTML 有 XSS 攻击风险
ctx.set('X-XSS-Protection', 1);
<div>
#{content}
</div>
转义 < <
和 > >
var escapeHtml = function(str) {
if(!str) return '';
str = str.replace(/&/g, '&');
// 转换 < >
str = str.replace(/</g, '<');
str = str.replace(/>/g, '&get;');
return str;
}
转义引号为 &quto;
var str = '';
str = str.replace(/"/g, '&quto;');
str = str.replace(/'/g, ''');
str = str.replace(/ /g, ' ');
<img class="#{class}"/>
<img class="hello" onload="alert(123)">
var data = "#{data}";
var data = "hello";alert(123);"";
解决: 转义"", 或者转换成 json
注意: 输入时是带有斜杠
- 黑名单: onerror 这种去掉
- 白名单:保留部分标签和属性
黑名单:
var str = '';
str = str.replace(/<\s*\/?script\s*/g, '');
str = str.replace(/javascript:[^'"]*/g, '');
str = str.replace(/onerror\s*=\s[^'"]?[^'"]*/g, '');
npm i cheerio
npm i xss
Content Security Policy
内容安全策略
用于指定哪些内容可执行
ctx.set('Content-Security-Policy', 'default-src');
- 内置函数转义
- DOM 解析白名单
- 第三方库
- CSP