最近我在往博客文章中添加评论功能后,发现使用 IE 访问某一篇文章的页面总是弹出警告:“Internet Explorer 已对此页面进行了修改,以帮助阻止跨站点脚本”。通过 Fiddler 不断调试和测试,发现是因为这篇文章的标题以 JavaScript:
开头,然后触发 IE 的 XSS 筛选器认为这是一个跨站点脚本攻击。其实文章标题中并不含有任何 JavaScript 脚本语句,只不过是以 JavaScript:
为开头,却最终导致 XSS 筛选器误判一个正常的页面。
问题现象
给所有的博客文章页面添加 Disqus 评论模块后,某一篇文章的页面在 IE 中总是弹出警告:“Internet Explorer 已对此页面进行了修改,以帮助阻止跨站点脚本”,评论模块无法显示。
问题分析
通过 Fiddler 给所有来自 Disqus 的 HTTPS 请求加断点,发现一旦下面这个 HTTPS 请求返回后 IE 就会弹出 XSS 警告。
继续通过 Fiddler 替换该请求内容进一步定位问题原因,发现是因为这篇文章对应的标题: JavaScript: What's the difference between HTML attribute and DOM property?
是以 JavaScript:
开头所导致的。Disqus 的 IFRAME 页面 URL 查询参数以及 JSON 字符串中都包含了这个标题,把标题开头替换为其他字符串,就不会有这个问题。
IE XSS 筛选器只是简单地检查字符串是否以 JavaScript:
开头来判断这个页面是否存在跨站点脚本,而不是真正解析字符串是否含有脚本代码。
解决方案
- 通过 IE 安全设置禁用 XSS 筛选器,但由于无法控制其他用户的客户端设置并且关闭后会带来潜在的安全风险,所以并不推荐。
- 可以给 HTTPS 请求添加返回头:
X-XSS-Protection: 0
,但是需要在 disqus 方面修改,所以也不可行。 - 目前我只能在 Disqus 中手动修改了这篇文章对应的标题,以避免触发 IE XSS 筛选器的误判。
长远来看还是希望 IE 能够修复这个问题,使 XSS 的判断更严谨,我已在 IE Feedback 提交了反馈: IE11 needlessly prompts XSS warning for harmless web content,重现页面:http://joji.me/test/ie-xss/。