关于web安全的几个nginx配置

3,308 阅读3分钟

关于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都不支持,建议不用,DENYSAMEORIGIN 兼容性还可以,可以按需使用。

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:schemes
  • self: 允许同源加载(注意:必须是同样的协议,域名,端口)
  • 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指令的功能发送违规报告。)

3.4 兼容性