Nginx安全优化—— CSRF与XSS防护

发布于 2020-03-13  5 次阅读


[infobox title="前言"]

Nginx作为我个人比较常用的异步框架网页服务器,由于其相对于Apache,拥有占用内存小,可大量并行处理等优点,非常适合我的小水管服务器。

我的主服务器以及测试服务器用的都是Nginx。最近,我在调试我的测试服务器的时候发现,经常有人在暴力破解我的SSH(端口已经更改,并上了防火墙)。而且,在我进行检查的时候,也发现很多Nginx自带的安全模块我并没有启用。所以,本章将先简单的记录一下我在对Nginx进行安全优化的其中两部分。

[/infobox]

[successbox title="CSRF防御"]

1. 概念:

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。[1] 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。(来源于维基百科

2. 原理:

  • 1. 用户打开浏览器,访问受信任的网站A,输入用户名与密码发送request登陆网站A。
  • 2. 在网站A服务器通过数据库对比通过验证后,网站A生成Cookie信息并返回给浏览器,此时浏览器接收response,用户登陆网站A成功,可以正常发送request到网站A。
  • 3. 用户在未退出网站A的同时,在同一浏览器打开网站B。
  • 4. 网站B接收到用户的request后,返回一段攻击性代码,并发出一个request要求浏览器访问第三方站点A。
  • 5. 浏览器在接受到攻击性代码后,根据网站B的request,在用户不知情的情况下,携带网站A的Cookie信息,向网站A发送request。网站A不能识别该request是由网站B发起的,所以会根据用户的Cookie信息以用户权限处理该request,导致来自于网站B的恶意代码被执行。

3. Nginx配置修改的防范方法:

该模块可以使用请求标头中“ Referer”行的错误值来阻止对站点的访问。

请记住,很容易欺骗此标头。 因此,使用此模块的目的不是要100%阻止这些请求,而是要阻止典型浏览器发出的大量请求。 另外,请考虑即使对于正确的请求,典型的浏览器也不总是提供“ Referer”标头。(来源于Nginx中文文档,Google翻译)

[block]

location ~* ^(/.+)\.(jpg|jpeg|jpe|png|gif)$ {

valid_referers none blocked www.mydomain.com mydomain.com;

if ($invalid_referer) {

return 403;

}

}

[/block]

[highlight lanaguage="nginx"]

 

location ~* ^(/.+)\.(jpg|jpeg|jpe|png|gif)$ # 正则表达式代表格式为jpg、jpeg、jpe、png、gif格式的图片
valid_referers # 代表可信referer,此处可信referer的设置将会使变量$invalid_referer的值为「0」,反之$invalid_referer的值为「1」,则执行IF条件名并返回相关限制结果。
none # 是指当referer为空的时候,比如在链接器中直接打开一个图片链接,若要禁止用户直接访问,则必须省掉none。
blocked # 是指经过某些代理或firewall过滤后的referer,比如省略了url前缀等, 同样地,若要禁止用户直接访问,则必须省掉blocked。

[/highlight]

PS:此方法也有防盗链的功能

 

[/successbox]

[successbox title="XSS防御"]

1. 概念:

跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。(来源于维基百科

2. 原理:

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。(来源于维基百科

3. Nginx配置修改的防范方法:

[block]

http {

add_header X-Frame-Options "SAMEORIGIN";

add_header X-XSS-Protection "1; mode=block";

add_header X-Content-Type-Options "nosniff";

}

[/block]

[highlight lanaguage=nginx"]

X-frame-options 
# 该响应头有三种赋值:DENY(不能被嵌入到任何iframe或frame中)、SAMEORIGIN(页面只能被本站页面嵌入到iframe或frame中)、ALLOW-FROM url(只能被嵌入到指定域名的框架中)。

X-XSS-Protection
# 该字段有三个可选配置值:0(表示关闭浏览器的XSS防护机制)、1(删除检测到的恶意代码, 如果响应报文中没有看到X-XSS-Protection 字段,那么浏览器就认为X-XSS-Protection配置为1,这是浏览器的默认设置)、1; mode=block(如果检测到恶意的代码,则不渲染恶意代码)。

X-Content-Type-Options
# 如果服务器发送响应头 "X-Content-Type-Options: nosniff",则 script 和 styleSheet 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME 类型混淆的攻击。nosniff为固定值,不可更改。

[/highlight]

 

[/successbox]