XSS简介
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全
其本质是用户输入的内容被执行,所以不应该信任用户的输入内容,大致包含以下几类
- 来自用户的 UGC 信息
- 来自第三方的链接
- URL 参数
- POST 参数
- Referer (可能来自不可信的来源)
- Cookie (可能来自其他子域注入)
XSS危害
- 取用户Cookie,获取用户隐私,盗取用户账号。
- 劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等。
- 强制弹出广告页面,刷流量等。
- 传播跨站脚本蠕虫,网页挂马等。
- 结合其他漏洞,如 CSRF 漏洞,实施进一步的攻击
- …
XSS分类
按持续时间分为持久型XSS攻击和非持久型xss攻击
按攻击方式分为反射型XSS、DOM型XSS、存储型XSS
反射型、DOM型主要是通过构造url或者输入框,使其被后台返回或者被js执行,存储型主要是通过类似评论等被存入数据库返回
XSS检测
- 通过手动构造字符检测
通过工具检测
XSS预防
对用户输入进行转义
在 XSS 攻击中,攻击者主要是通过构造特殊字符来注入脚本,所以对用户的输入进行检测就很有必要,并且需要在客户端与服务端都进行输入检测,然后对用户输入的数据进行转义。主要就是对输入所包含的特殊字符进行转义,如 \<,\>,&,",',来防止 XSS 攻击。
function escapeHTML(str) {
if (!str) return '';
str = str.replace(/&/g, "&");
str = str.replace(/</g, "<");
str = str.replace(/>/g, ">");
str = str.replace(/"/g, """);
str = str.replace(/'/g, "'");
return str;
};
设置白名单
针对需要保留html的用户输入,选择设置html白名单
内容安全策略(CSP)
两种方法可以启用 CSP,通过启用CSP,明确哪些外部资源可以加载执行。一种是通过 HTTP 头信息的 Content-Security-Policy 的字段。
# HTTP头
Content-Security-Policy: script-src 'self';
object-src 'none';
style-src cdn.example.org third-party.org;
child-src https:
# meta
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
/* 脚本: 只信任当前域名
<object>标签: 不信任任何 URL,即不加载任何资源
样式表: 只信任 cdn.example.org 和 third-party.org
页面子内容,如 <frame>、<iframe>: 必须使用HTTPS协议加载
其他资源: 没有限制 */
一些增加难度和减少损失的方法
- HTTP-only Cookie
- 限制输入内容长度
- 尽量避免使用eval
- 验证码
浏览器自带防御(X-XSS-Protection )
HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个功能,当检测到跨站脚本攻击(XSS)时,浏览器将停止加载页面。
X-XSS-Protection: 0
# 禁止XSS过滤。
X-XSS-Protection: 1
# 启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。
X-XSS-Protection: 1; mode=block
# 启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。
X-XSS-Protection: 1; report=<reporting-uri>
# 启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。
3 comments
作者的观点新颖且实用,让人在阅读中获得了新的思考和灵感。
意象选取精妙,营造出空灵意境。
若能结合热点事件分析,会更富时代性。