轻松理解 X-XSS-Protection

本文作者:晚风(信安之路作者团队成员)

首先我们来理解一下什么是“X-XSS-Protection”,从字面意思上看,就是浏览器内置的一种 XSS 防范措施。

没错,这是 HTTP 的一个响应头字段,要开启很简单,在服务器的响应报文里加上这个字段即可。浏览器接收到这个字段则会启用对应的 XSS 防范模块。

IE、Chrome 和 Safari 都内置了这个模块。edge 和火狐没有内置这个模块。

在 IE 上它叫 XSS Filter,在 Chrome 上它叫 XSS Auditor。

这个模块只能检测反射型的 XSS,下文的 XSS 专指反射型的 XSS。

开启这个功能后,当浏览器检测到跨站脚本攻击(XSS)时,浏览器将对页面做清理或直接阻止整个页面的加载。

我觉得在目前这种保护措施还是挺有必要的,虽然现代的浏览器支持强大的 CSP(内容安全策略)来禁用不安全的 JavaScript 脚本,但可能由于 CSP 配置起来较为繁琐或是修改原有的配置成本较高,目前来看还是有很大一部分网站没有用上 CSP,并且对于一些不支持 CSP 的旧版浏览器,X-XSS-Protection 可以为他们提供保护。

X-XSS-Protection有四种语法:

X-XSS-Protection : 0 X-XSS-Protection : 1 X-XSS-Protection : 1; mode=block X-XSS-Protection : 1; report=<reporting-uri>

X-XSS-Protection : 0 表示禁用 XSS 过滤这个功能
X-XSS-Protection : 1 表示启用 XSS 过滤

一般浏览器中都是默认开启。如果检测到跨站脚本攻击,浏览器将清除在页面上检测到的不安全的部分

X-XSS-Protection : 1;mode=block 表示启用XSS过滤器

如果检测到攻击,浏览器不会像上面的选项一样将不安全的部分删除,而是直接阻止整个页面的加载

X-XSS-Protection : 1;report=<reporting-URI> 表示启用 XSS 过滤

如果检测到跨站脚本攻击,浏览器会清除在页面上检测到的不安全的部分,并使用report-uri的功能 POST 一个 XSS 警报。这个功能只有在 Chrome 中有效果,在 IE 中无效。

然后我自己刚刚突发奇想,把选项写成X-XSS-Protection:1;mode=block;report=<reporting-uri>的格式,发现也是可以的。

可以同时阻止页面的加载,也可以发送一个 XSS 警报。注意这里顺序不能错,因为 IE 不支持 report XSS 警报,所以如果mode=block写在最后面的话,在IE中就无法阻止整个页面加载,而是只清除了不安全的代码。

所以,最优的选项是?

看到这里你一定觉得X-XSS-Protection:1;mode=block;report=<reporting-uri>是最优的选项。没错,我也是这么认为的。但是!凡事不是绝对的。在有些情况下,默认开启(X-XSS-Protection:1)的浏览器的 XSS filter/auditor 反而会使我们的页面变得不安全。原因很简单:

  1. XSS filter/auditor 的过滤能力有限。这个模块的原理就是一堆的过滤规则,那就会有被绕过的可能。
  2. 清除能力有限。这个模块会清除不安全的 XSS 代码,这点是毋庸置疑的。但是如果攻击者精心构造了一段代码,在被清除了部分代码后剩下的代码仍然可以构造成恶意代码。 打个简单的比方,我在一段文字中的过滤 'script' 字符串,但是假设我构造了一段 "sscriptcript" 字符串,如果没有循环过滤,那么在过滤后仍然有“script”存在,没过滤干净会导致严重的安全问题。还有可能将无害的标签变成有害的标签。IE 8 中的 XSS 过滤器缺陷就曾经导致了一个 UXSS。

那这么说直接阻止页面加载(X-XSS-Protection:1;mode=block)不就安全了?

不然。这个选项在检测到 XSS 后会直接阻止页面的加载。但有人研究出会导致信息泄露,像这个例子:

https://bugs.chromium.org/p/chromium/issues/detail?id=396544

所以,对网站管理者来说,当你认为你的网页对 XSS 的防御能力已经很优秀了,那你就不需要开启 X-XSS-Protection 这个选项了,把它的值设置为 0 即可。

否则,X-XSS-Protection:1;mode=block;report=<reporting-uri>是你最优的选择。

推荐阅读

我们来聊一聊渗透测试

轻松理解什么是 webshell

轻松理解什么是 SQL 注入

轻松理解什么是 C&C 服务器

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2018-06-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏不想当开发的产品不是好测试

jenkins 邮件添加附件

背景 当CI执行失败的时候,想获取到失败的用例,然后在本地调试,testNG是自带一个testng-failed.xml来记录的; 想法:尝试使用git 来p...

2555
来自专栏Web 开发

推荐两款HTTP Log分析利器

一款是Apache Logs Viewer,这是一款PC端日志分析软件,从服务器上面把log日志下载回来跑的。

780
来自专栏企鹅号快讯

g4e基础篇#4 了解Git存储库

Git 存储库看上去就是一个文件夹,只是在这个文件夹中不仅仅保存了所有文件的当前版本,也同时保存了所有的历史记录,这些额外的信息都保存在当前文件夹下面的.git...

2396
来自专栏耕耘实录

CentOS7.X的系统管理、安全设置及系统优化思路

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

2612
来自专栏架构师之路

TCP接入层的负载均衡、高可用、扩展性架构

一、web-server的负载均衡 ? 互联网架构中,web-server接入一般使用nginx来做反向代理,实施负载均衡。整个架构分三层: 上游调用层,一般是...

5056
来自专栏懒人开发

ZooKeeper入门

我们知道,著名的hadoop,kafka,dubbo 都是基于zookeeper而构建。

3622
来自专栏锦小年的博客

pycharm使用笔记2-远程连接

随着科技的发展,远程办公已经是一种趋势,远程开发能力对于每一个程序员来说都是必不可少的。有时候就算在公司,在进行开发的时候有许多的数据都是储存在服务器上的,所以...

39710
来自专栏JetpropelledSnake

Python Web学习笔记之Python多线程和多进程、协程入门

进程和线程究竟是什么?如何使用进程和线程?什么场景下需要使用进程和线程?协程又是什么?协程和线程的关系和区别有哪些? 程序切换-CPU时间的分配 首先,我们的任...

3925
来自专栏后端技术探索

Nginx如何做流量控制

英文原文:https://www.nginx.com/blog/rate-limiting-nginx/

5944
来自专栏Java架构沉思录

Zookeeper总览

ZooKeeper是一款开源的 分布式应用 的 分布式协调服务 。它包含一个简单的 原语集 ,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zoo...

1881

扫码关注云+社区

领取腾讯云代金券