-
什么是 XSS ?
XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等。
-
怎样判断是否存在 XSS ?
安全人员发现 XSS 后, 经常会构造一个含有 alert 的 url 给开发人员. 例如:
xss01: http://www.56123.org/wuliu.asp?c=0576<script>alert(1)</script> xss02: http://bbs.ifeng.com/viewthread.php?tid=14831697');alert(document.domain);alert('1
alert 的作用是用来方便地定位 XSS 的位置. 在 Chrome 中打开 url xss01 查看网页源码有
其中的 script. 标签高亮表示在 url 中插入的 js 代码有效, 证明 XSS 存在.
打开 xss02 查看源码有:
插入的 js 在 script. 标签中会执行, 证明 XSS 存在.
-
浏览器为什么不弹窗?
虽然插入的 js 有效, 但用 Chrome 打开 xss01 不会弹窗. 这是因为现在的浏览器, Chrome, IE10 等, 本身都有 XSS 过滤的功能.
查看 Chrome 的 Console 有:
既然现在的浏览器基本都有 XSS 过滤的功能, 为什么网站还要防御 XSS 呢?
-
IE6 和一些小众的浏览器的并没有 XSS 过滤功能. 在中国, 浏览器市场份额是:
-
当插入的 js 在源码本身的 script. 标签中时, 很多浏览器不能过滤. 用 Chrome 打开 xss02 有:
-
在一些特殊的场合, js 会被执行.
-
-
应该在什么地方处理?
很多时候, 开发的同学会就 XSS 由前端还是后端修复而争论.
个人觉得 XSS解决方案系列之一:淘宝、百度、腾讯的解决方案之瑕疵 的三原则说得很有道理, 即
何时展示何时解决
.个人理解, 对于提交一个 url 来说, 返回 html 或者 返回数据 的接口即为”展示”处.
也就是说, 该接口负责处理 xss .
-
是否可以在攻击发起的地方(web前端,或者form提交的地方)杜绝掉?
攻击者可以构造任意的 url 诱使用户点击. 来自用户的数据都是不可信的.
-
怎样修复 XSS ?
需要将下面的特殊字符转义:
-
& (和号) 成为 \&
-
” (双引号) 成为 \"
-
’ (单引号) 成为 \'
-
< (小于) 成为 \<
-
(大于) 成为 \>
在 PHP 中一般采用 htmlspecialchars 函数.
JSP 中可自己实现转义, 可参考:
JSP – htmlspecialchars() htmlentities() PHP like function – version 2.0
-
-
过滤掉 script. 之类的标签是否解决问题?
对于 xss01, 过滤 html 的 tag 是可行的, 但是对于 xss02 这种插入的 js 代码在原本代码的 script. 标签中的情况, 单纯过滤 tag 是不行的.