Nginx安全配置之请求头配置#
隐藏版本号#
http {
server_tokens off;
}
Header头设置#
通过以下设置可有效防止XSS攻击
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
X-Frame-Options: 响应头表示是否允许浏览器加载frame等属性,有三个配置DENY
禁止任何网页被嵌入,SAMEORIGIN
只允许本网站的嵌套,ALLOW-FROM
允许指定地址的嵌套
X-XSS-Protection: 表示启用XSS过滤(禁用过滤为X-XSS-Protection: 0
),mode=block
表示若检查到XSS攻击则停止渲染页面
X-Content-Type-Options: 响应头用来指定浏览器对未指定或错误指定Content-Type
资源真正类型的猜测行为,nosniff 表示不允许任何猜测
在通常的请求响应中,浏览器会根据Content-Type
来分辨响应的类型,但当响应类型未指定或错误指定时,浏览会尝试启用MIME-sniffing来猜测资源的响应类型,这是非常危险的
例如一个.jpg的图片文件被恶意嵌入了可执行的js代码,在开启资源类型猜测的情况下,浏览器将执行嵌入的js代码,可能会有意想不到的后果
另外还有几个关于请求头的安全配置需要注意
Content-Security-Policy: 定义页面可以加载哪些资源,
add_header Content-Security-Policy "default-src 'self'";
上边的配置会限制所有的外部资源,都只能从当前域名加载,其中default-src
定义针对所有类型资源的默认加载策略,self
允许来自相同来源的内容
Strict-Transport-Security: 会告诉浏览器用HTTPS协议代替HTTP来访问目标站点
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
上边的配置表示当用户第一次访问后,会返回一个包含了Strict-Transport-Security
响应头的字段,这个字段会告诉浏览器,在接下来的31536000秒内,当前网站的所有请求都使用https协议访问,参数includeSubDomains
是可选的,表示所有子域名也将采用同样的规则
X-Frame-Options响应头#
X-Frame-Options HTTP 响应头是微软提出来的一个HTTP响应头,主要用来给浏览器指示允许一个页面可否在 , 或者 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持(ClickJacking{注1}) 的攻击。
使用X-Frame-Options有三个值
# DENY
# 表示该页面不允许在frame中展示,即使在相同域名的页面中嵌套也不允许
# SAMEORIGIN
# 表示该页面可以在相同域名页面的frame中展示
# ALLOW-FROM url
# 表示该页面可以在指定来源的frame中展示
注意:
如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。
PS:目前发现这个HTTP响应头会带来的问题就是百度统计中的“热点追踪(页面点击图)”功能会失效,这也说明百度统计的“热点追踪(页面点击图)”使用的是 frame 嵌入引用网页的形式,这时候大家可以使用 X-Frame-Options 的ALLOW-FROM uri来指定百度统计域名为可 frame 嵌入域名即可。具体在Nginx里可以采用如下的方式添加响应头
配置案例
add_header X-Frame-Options:ALLOW-FROM https://tongji.baidu.com;
add_header X-Frame-Options:SAMEORIGIN;
X-Content-Type-Options响应头#
解释:
互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:text/html代表html文档,image/png是PNG图片,text/css是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。
例如,我们即使给一个html文档指定Content-Type为text/plain,在IE8-中这个文档依然会被当做html来解析。利用浏览器的这个特性,攻击者甚至可以让原本应该解析为图片的请求被解析为JavaScript。在Nginx里通过下面这个响应头可以禁用浏览器的类型猜测行为:
# X-Content-Type-Options HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,
# 而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。
# X-Content-Type-Options响应头的缺失使得目标URL更易遭受跨站脚本攻击。
# 如果服务器发送响应头 “X-Content-Type-Options: nosniff”,则 script 和 styleSheet
# 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME 类型混淆的攻击。
配置案例:
add_header X-Content-Type-Options: nosniff;
X-Content-Security-Policy响应头#
# HTTP 响应头Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源。
# 除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。
#Content-Security-Policy响应头的缺失使得目标URL更易遭受跨站脚本攻击。
配置案例
# 要使用 CSP,只需要服务端输出类似这样的响应头就行了:
Content-Security-Policy: default-src 'self'
# default-src 是 CSP 指令,多个指令之间用英文分号分割;'self' 是指令值,多个指令值用英文空格分割。目前,有这些 CSP 指令:
StrictTransportSecurity响应头#
配置案例:
0:# 禁用XSS保护;
1:# 启用XSS保护;
1; # mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换);
# HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,
# 当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。
# X-XSS-Protection响应头的缺失使得目标URL更易遭受跨站脚本攻击。
# 浏览器提供的XSS保护机制并不完美,但是开启后仍然可以提升攻击难度,总之没有特别的理由,不要关闭它。
X-XSS-Protection响应头#
配置案例
# add_header X-Xss-Protection: 1;
# add_header X-Xss-Protection: mod=block;
配置案例
#Google
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
#Twitter
strict-transport-security: max-age=631138519
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
#PayPal
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=14400
#Facebook
配置了详细的CSP,关闭了XSS保护
strict-transport-security: max-age=60
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 0
content-security-policy: default-src *;script-src https://*.facebook.com http://*.facebook.com https://*.fbcdn.net http://
配置案例:
add_header Access-Control-Allow-Origin *.com,*.zhix.com,*.abca.com;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
#add_header X-Frame-Options sameorigin always;
add_header "X-XSS-Protection" "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self' elszxy.china.com *.ana.com *.zn.com 'unsafe-inline' 'unsafe-eval' blob: data: ;";
valid_referers none blocked localhost abcna.com elina.com *.abna.com *.zhyun.com;
if ($invalid_referer) {
return 403;
}