在Web应用中,如果查看HTTP响应信息你有可能会发现X-Powered-By: PHP/5.2.1,Server:nginx/1.5.1这样的响应头信息.这样就会把服务器信息给暴露出来,我们可以修改配置隐藏服务器环境信息来增加服务器的安全性.

X-Powered-By: PHP/5.3.29 这个选项我们可以修改php.ini文件,找到expose_php

expose_php = On  修改为:expose_php = Off

Server:nginx/1.5.1:修改nginx配置文件nginx.conf,增加一个配置项

server_tokens off;

重启环境配置,就会发现X-Powered-By: PHP/5.3.29无法找到了,Server:nginx/1.5.1只会显示nginx服务器并不会显示nginx服务器版本信息,Server:nginx

如果需要隐藏Server信息,需要改nginx的源码或者使用tenginx。

Nginx的其它安全配置

禁用非必要的方法

在__Server__中新增

server {
	if ($request_method !~ ^(GET|POST|DELETE|PUT|PATCH|HEAD|OPTIONS)$ ) {
				return  444;
	}
}

或者__location__中新增

location / {
		limit_except GET POST {  # 限制除了get,post的方法之外,全部拒绝
						deny all;
		}
}

配置响应头

add_header  X-Frame-Options  deny;
add_header  X-Content-Type-Options  nosniff;
add_header  X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security max-age=86400;
add_header Content-Security-Policy upgrade-insecure-requests;

X-Frame-Options 是为了减少点击劫持(Clickjacking)而引入的一个响应头。Chrome4+、Firefox3.6.9+、IE8+均支持.

配置参考

deny :不允许被任何页面嵌入
sameorigin: 不允许被本域以外的页面嵌入
allow-from uri: 不允许被指定的域名以外的页面嵌入

如果某页面被不被允许的页面以<iframe><frame>的形式嵌入,IE会显示类似于“此内容无法在框架中显示”的提示信息,Chrome和Firefox都会在控制台打印信息。由于嵌入的页面不会加载,这就减少了点击劫持的发生.

X-XSS-Protection 用来防范XSS

配置参考

0 : 禁用XSS保护
1: 启用XSS保护
1; mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面

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。通过下面这个响应头可以禁用浏览器的类型猜测行为:

配置值参考

nodiff :不允许猜测资源类型

Strict-Transport-Security HTTP Strict Transport Security,简称为HSTS。它允许一个HTTPS网站,要求浏览器总是通过HTTPS来访问它。现阶段,除了Chrome浏览器,Firefox4+,以及Firefox的NoScript扩展都支持这个响应头。

我们知道HTTPS相对于HTTP有更好的安全性,而很多HTTPS网站,也可以通过HTTP来访问。开发人员的失误或者用户主动输入地址,都有可能导致用户以HTTP访问网站,降低了安全性。一般,我们会通过Web Server发送301/302重定向来解决这个问题。现在有了HSTS,可以让浏览器帮你做这个跳转,省一次HTTP请求。另外,浏览器本地替换可以保证只会发送HTTPS请求,避免被劫持。

配置参考

max-age=16070400; includeSubDomains

includeSubDomains是可选的,用来指定是否作用于子域名。支持HSTS的浏览器遇到这个响应头,会把当前网站加入HSTS列表,然后在max-age指定的秒数内,当前网站所有请求都会被重定向为https。即使用户主动输入http://或者不输入协议部分,都将重定向到https://地址。