添加XSS防护等响应头后Nikto仍报未定义,求排查原因
先说说我的情况:我在服务器代码里加了两行响应头配置:
header('X-Content-Type-Options: nosniff'); header('x-xss-protection: 1; mode=block');
但用Nikto v2.1.6扫描我的站点(目标端口443,扫描时间2020-01-18 14:54:02 GMT-5,服务器用的Cloudflare)时,还是检出两个问题:
- The X-XSS-Protection header is not defined. 这个头可以提示浏览器防范部分XSS攻击;
- The X-Content-Type-Options header is not set. 这可能导致浏览器以和MIME类型不符的方式渲染内容。
补充一下:我用curl -I app.com测试时,得到的是301重定向响应,响应头信息如下:
HTTP/1.1 301 Moved Permanently
Date: Sat, 18 Jan 2020 20:17:26 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Set-Cookie: __cfduid=de78c7d75c4277a60649fb1d63d00ac531579378646; expires=Mon, 17-Feb-20 20:17:26 GMT; path=/; domain=.app.com; HttpOnly; SameSite=Lax
Location: https://app.com/
CF-Cache-Status: DYNAMIC
Server: cloudflare
CF-RAY: 5573409b9a45f051-EWR
这不是你代码的问题,大概率是重定向和Cloudflare的逻辑导致的!
1. 重定向响应根本没经过你的业务代码
你用curl -I app.com访问的是HTTP协议的地址,得到的301是跳转到HTTPS的响应。这个响应要么是Cloudflare的强制HTTPS配置生成的,要么是你服务器(比如Nginx/Apache)的跳转规则生成的——不管哪种情况,这个301响应都没触发你业务代码里的header()调用,自然不会带上你加的那两个安全头。
Nikto扫描的时候,可能先扫了HTTP端口80,拿到这个没安全头的301响应后,就直接判定你站点缺少这些头;或者后续扫描HTTPS时,因为缓存或扫描逻辑的问题,没正确检测到最终业务响应里的头。
2. Cloudflare的缓存或头处理可能覆盖了你的配置
就算你访问HTTPS地址,如果Cloudflare的缓存里存的是你加安全头之前的响应,那返回的内容里也不会有这两个头。另外,Cloudflare的某些默认配置可能会过滤或覆盖你服务器返回的响应头。
排查和解决方法
- 先确认HTTPS响应的真实情况:直接用
curl -I https://app.com测试,看看响应头里有没有X-Content-Type-Options和X-XSS-Protection,这才是你业务服务器返回的真实响应; - 全局配置安全头:如果是Cloudflare的强制HTTPS跳转,去Cloudflare后台的「规则」→「转换规则」里添加这两个安全头,让Cloudflare在所有响应(包括重定向)里都带上;如果是服务器配置的跳转,直接在Nginx/Apache的全局配置里添加这两个头,比只在业务代码里加更可靠;
- 清理Cloudflare缓存:确保最新的响应头能被返回给扫描工具;
- 指定HTTPS地址给Nikto:扫描时直接用
nikto -h https://app.com,跳过HTTP跳转的步骤,让它直接检测HTTPS的响应头。
内容的提问来源于stack exchange,提问作者code-8

