关于web安全的几个nginx配置
1. X-Frame-Options
1.1 作用
该响应头是用来给浏览器指示该页面是否允许在<frame>
,<iframe>
, <embed>
, <object>
中嵌套展示。从而可以避免点击劫持攻击。
1.2 如何配置
将下面这行添加到http
, server
或者location
的配置中:
add_header X-Frame-Options SAMEORIGIN;
1.3 语法含义
X-Frame-Options有三个可能的值:
X-Frame-Options: DENY (不允许任何域名嵌套)
X-Frame-Options: SAMEORIGIN(可以在相同域名嵌套,注意,子域名不算同源域名)
X-Frame-Options: ALLOW-FROM https://example.com/(允许指定来源,注意,不支持通配和多行枚举)
1.4 兼容性
由于ALLOW-FROM
的兼容性chrome、safari都不支持,建议不用,DENY
和 SAMEORIGIN
兼容性还可以,可以按需使用。
2. Content-Security-Policy
2.1 作用
该响应头是用来规定页面可以加载哪些资源,等同于设置白名单,从而可以有效避免xss攻击。
2.2 如何配置
将下面这行添加到http
, server
或者location
的配置中,策略可以自己搭配,下面只是举个例子:
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self';"
2.3 语法含义
常用指令:
default-src
: 加载资源的默认策略script-src
: 加载js的策略style-src
: 加载css的策略img-src
: 加载图片的策略connect-src
: ajax和websocket策略
常用值:
*
: 允许任何url除了data:blob:filesystem:schemesself
: 允许同源加载(注意:必须是同样的协议,域名,端口)data:
: 允许data协议加载资源(比如base64编码的图片)*.example.com
: 允许example.com下子域名加载unsafe-inline
: 允许行内style、行内script、onclick、javascript: URIs
<script>getyourcookie()</script>
<a href="" onclick="handleClick"></a>
<a href="javascript:handleClick()"></a>
<div style="display:none"></div>
unsafe-eval
: 允许字符串经过eval()等函数转义进而被当作脚本执行。比如eval()
,new Function
,setTimeout
,setInterval
alert(eval("foo.bar.baz"));
window.setTimeout("alert('hi')", 10);
window.setInterval("alert('hi')", 10);
new Function("return foo.bar.baz");
注意:unsafe-eval
这个策略,如果本身业务代码不包含上述的操作,还需要检查打包工具是否生成了上述类似的方法,如果有的话,没加这一条策略,部署到线上涉及到到代码段将不会执行,也不会有任何报错。
2.4 兼容性
3. X-XSS-Protection
3.1 作用
X-XSS-Protection时IE, Chrome和Safari的一个功能,当旧版浏览器还不支持Content-Security-Policy
时,可以用来避免xss攻击。
3.2 如何配置
将下面这行添加到http
, server
或者location
的配置中:
add_header X-XSS-Protection "1; mode=block";
3.3 语法含义
X-XSS-Protection有四个可能的值:
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过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。)