(本文演示 github:https://github.com/zphhhhh/node-secure)
什么是 XSS 攻击?
XSS 全称 Cross-Site Scripting,可译为:跨站脚本攻击,由于 CSS 已被占用,因此简称 XSS。
一句话理解 XSS:不可信内容经处理后被当做可信内容再渲染。
XSS 攻击的种类
XSS 攻击可细分为 反射型 XSS、持久型 XSS、DOM XSS,前两种针对服务器,后一种针对客户端。
反射型 XSS
不可信内容提交到服务器,立即在响应中被返回。
比如:有一个登陆页面需要输入用户名,提交后会显示 “你好,XXX”,这里的 XXX 即有可能存在反射型 XSS 攻击漏洞。
持久型 XSS
不可信内容提交到服务器,被保存到服务器数据库,下次需要时被当做可信内容被返回。
比如:恶意代码写入个人资料页,所有访问我的资料的朋友都会遭到攻击
DOM XSS
不可信内容被插入到页面DOM节点。
比如:网络劫持(使用数据流量访问网页时出现的网络服务商链接)
XSS 攻击的常见攻击效果
- 获取用户的 cookie,实现会话劫持
- 盗取网银资产
- 在页面伪造表单,获取用户的账号密码
- XSS Worm(终极手段)
- 等等
防御 XSS
为防御 XSS,我们首先要知道 XSS 攻击的本质是不安全的
HTML 注入,可通过在 HTML、CSS、JS 或 HTTP 协议层次上进行防范。下面提供一些常用的防御策略:
- 输入检查
- 用户名、邮箱等表单验证(前台/服务器二次验证)
- 富文本使用白名单机制等
- 输出检查
- HTML-Encoder
- js-Encoder
- HTTP 头部:HttpOnly(四两拨千千)
- 设置 cookie 时加入 HttpOnly 可使 js 脚本无法获取 cookie
- HTTP 头部:CSP(Content Security Policy)
- 定义允许的资源加载地址,比如图片 / 视频 / JS 脚本等
- HTTPS加密访问
- 有效防止 DOM XSS 攻击
参考:
《白帽子讲 Web 安全》