最近我在往博客文章中添加评论功能后,发现使用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/。