跨域脚本攻击(XSS)是把恶意脚本注入 HTML 文件或 DOM 中,在用户浏览页面时实施攻击的一种手段。
一、恶意脚本能做什么?
- 窃取 Cookie 信息
document.cookie; // 输出:Gnahz=Test-Cookie
-
监听用户行为, addEventListener 接口监听键盘事件,比如获取输入的信用卡信息。
-
修改 DOM 伪造假的登录窗口,欺骗用户输入用户名和密码等信息。
-
在页面内生成浮窗广告。
二、如何攻击?常见的有三种注入方式:存储性 XSS 攻击、反射型 XSS 攻击和基于 DOM 的 XSS 攻击。
- 存储型 XSS 攻击
1、黑客利用站点漏洞将一段恶意的 JavaScript 代码提交到数据库中。
2、如果用户向网站请求了包含恶意脚本的页面。
3、浏览这页面时,恶意脚本就会把用户的 Cookie 信息等数据窃取上传到黑客的服务器。
- 反射型 XSS 攻击
1、用户将一段含有恶意代码的请求提交给 Web 服务器。
2、服务器受到请求后又将恶意代码反射给浏览器。
与存储型 XSS 攻击不同是:服务器不会存储反射 XSS 攻击的脚本。
现实场景:聊天群或邮箱诱导用户点击的恶意链接。
- 基于 DOM 的 XSS 攻击
不牵涉到 Web 服务器的攻击,通过各种手段将恶意脚本注入用户的页面中,比如通过网络劫持在页面传输过程中或使用页面过程中修改 HTML 页面的内容(通过 WiFi 路由器劫持、通过本地恶意软件劫持)
-
三者共同点:都需要往页面注入恶意脚本,获取用户数据。
-
三者不同点:注入方法不一样,存储型 XSS 攻击和放射型 XSS 攻击是服务器端的安全漏洞;而基于 DOM 的攻击是客户端
三、如何防范?
1、服务器对输入脚本过滤或转码
- 过滤
// strip_tags(str, allowable_tags):从字符串中去除 HTML 和 PHP 标记
$test = "<script>alert('xss攻击')</script>";
echo strip_tags($test); // alert('xss攻击')
- 转码
// htmlspecialchars(string, flages):将特殊字符转换为 HTML 实体
// flages 默认是 ENT_COMPAT(只转双引号) | ENT_HTML401(HTML 4.01 处理代码)
$xss = '<script>alert("xss攻击")</script>';
// 输出:<script>alert("xss攻击")</script>
echo htmlspecialchars($xss) ."\n";
// flages = ENT_QUOTES 是:既转换双引号也转换单引号
// 输出:<script>alert('xss攻击')</script>
echo htmlspecialchars("<script>alert('xss攻击')</script>", ENT_QUOTES);
2、实施严格的 CSP
-
限制加载其它域下的资源文件,即使被注入恶意的 JavaScript 代码也无法被加载。
-
禁止向第三方域提交数据,这样数据就不会被外泄。
-
禁止执行内联脚本和未授权的脚本。
3、设置 HttpOnly 属性,让 Cookie 仅通过 HTTP 协议访问
// 设置 httponly,让 Cookie 仅通过 HTTP 协议访问
setcookie("Gnahz", "Test-Cookie", time()+3600, '', '', false, true);
document.cookie; // 输出:""
4、添加验证码防止脚本冒充用户提交危险操作
5、限制不受信任的输入长度,增大 XSS 攻击难度
来源:oschina
链接:https://my.oschina.net/u/4054189/blog/3192941