目的
首先我们来理解一下什么是“X-XSS-Protection”,从字面意思上看,就是浏览器内置的一种 XSS 防范措施。没错,这是 HTTP 的一个响应头字段,要开启很简单,在服务器的响应报文里加上这个字段即可。浏览器接收到这个字段则会启用对应的 XSS 防范模块。
这个header主要是用来防止浏览器中的反射性xss。现在,只有IE,chrome和safari(webkit)支持这个header。
开启这个功能后,当浏览器检测到跨站脚本G击(XSS)时,浏览器将对页面做清理或直接阻止整个页面的加载。
我觉得在目前这种保护措施还是挺有必要的,虽然现代的浏览器支持强大的 CSP(内容安全策略)来禁用不安全的 JavaScript 脚本,但可能由于 CSP 配置起来较为繁琐或是修改原有的配置成本较高,目前来看还是有很大一部分网站没有用上 CSP,并且对于一些不支持 CSP 的旧版浏览器,X-XSS-Protection 可以为他们提供保护。
正确的设置
X-XSS-Protection : 0 –关闭对浏览器的xss防护 表示禁用 XSS 过滤这个功能
X-XSS-Protection : 1 –开启xss防护
X-XSS-Protection : 1; mode=block –开启xss防护并通知浏览器阻止而不是过滤用户注入的脚本。
X-XSS-Protection : 1; report=http://site.com/report –这个只有chrome和webkit内核的浏览器支持,这种模式告诉浏览器当发现疑似xss攻-GJ击的时候就将这部分数据post到指定地址。
通常不正确的设置
0; mode=block; – 记住当配置为0的时候,即使加了mode=block选项也是没有效果的。需要指出的是,chrome在发现这种错误的配置后还是会开启xss防护。
1 mode=block; – 数字和选项之间必须是用分号分割,逗号和空格都是错误的。但是这种错误配置情况下,IE和chrome还是默认会清洗xss攻-GJ击,但是不会阻拦。
如何检测
如果过滤器检测或阻拦了一个反射性xss以后,IE会弹出一个对话框。当设置为1时,chrome会隐藏对反射性xss的输出。如果是设置为 1; mode=block ,那么chrome会直接将user-agent置为一个空值:, URL 这种形式。