提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

恶意跨站脚本(Cross-Site Scripting)的危害想必大家都知道,除了做好服务器端的安全过滤外,现在我们还可以利用一下IE8或者IE9的新的安全特性,那就是跨站脚本筛选器(Cross-Site Scripting Filter)。

对于IE的跨站脚本筛选器可以先参考IEBlog的 《IE8 Security Part IV: The XSS Filter》 这篇文章做个详细了解。如果IE检测到了跨站脚本攻击,那么IE将对页面做相应的修改以阻止攻击的发生,比如说这里有个 示例页面 。当我点击Say Hello的时候,IE会将表单的XSS脚本POST到服务端页面,这时IE8及以上浏览器检测到了可能的XSS攻击,于是提示“Internet Explorer 已对此页面进行了修改,以帮助阻止跨站点脚本。”

XSS跨站脚本筛选器修改跨站脚本

由此可见微软在IE8及后继浏览器的安全上是下了功夫的,我们如何开启这一特性呢?好消息是这种安全特性默认就是打开的,在IE浏览器的默认、可信和限制区域。对于本地局域网区域(Local Intranet Zone)我们可以通过下面的HTTP header来默认打开这一特性:

X-XSS-Protection: 1

可能有时我们制作的网页并不需要IE为我们多此一举的拦截XSS,因为我们可能就需要提交脚本什么的,如果IE修改了提交内容,也许会给我们带来麻烦,这种情况下我们就需要关闭IE的XSS保护特性,客户端通过IE浏览器 - Internet 选项 - 安全 - Internet - 自定义级别 - 脚本 - 启用XSS筛选器 - 禁用 - 确定:

禁用XSS筛选器

不过这个只能禁用当前客户端的XSS保护功能,而且会丧失IE对于所有页面的XSS保护,而且你也无法指示用户这样做,所以 强烈不推荐这个办法 。推荐的办法是:在正常情况下,通过下面的HTTP header,就可以完美的关闭发送这个header的页面XSS保护特性了。

X-XSS-Protection: 0

后来IE团队觉得还可以对XSS做更多的控制,于是对于XSS筛选器增加了一项功能,请看新的HTTP header:

X-XSS-Protection: 1; mode=block

除了紧接X-XSS-Protection后面的1指示IE浏览器打开XSS筛选器外,后面那个mode=block是什么意思呢?其实这段Header的意思是当检测到XSS Attack时,Internet Explorer将停止渲染页面,相比较之前的修改XSS部分代码继续展现内容而言,这里直接发送一个字符#,也就是说整个页面的内容就一个“#”号。这里有个 示例页面 可供大家测试。

XSS跨站脚本筛选器阻止跨站脚本

对于ASP.NET我们可以通过修改web.config来配置X-XSS-Protection属性,比如通过下面的配置关闭XSS跨站脚本筛选器:

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <clear />
        <add name=" X-XSS-Protection" value="0" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

参考文档