Nginx Referer校验模块 防盗链和CSRF ngx 您所在的位置:网站首页 教资登录非法请求来源 Nginx Referer校验模块 防盗链和CSRF ngx

Nginx Referer校验模块 防盗链和CSRF ngx

2024-01-16 19:37| 来源: 网络整理| 查看: 265

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  ngx_http_referer_module用于通过检测"Referer"请求头来防御CSRF漏洞,过滤掉具有无效"Referer"头的请求。

  需要注意的是,使用适当的"Referer"标头值来伪造请求非常容易,因此,此模块并不能彻底组织此类请求。应用时,还需考虑到常规浏览器或有效请求可能不会发送"Referer"请求头。

  什么是Referer

  Http Referer是Header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。

  下面以百度中搜索"CSDN"为例,搜索时,会自动在’Referer’中设置当前网页地址,用来描述"搜索CSDN"这一请求的来源:

在这里插入图片描述

  CSRF 与 Referer

  CSRF(Cross-site request forgery),即跨站请求伪造,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件、发消息、甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了Web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

  Referer,是一个Http请求头,用于标识请求来源于哪个地址,理论上,Referer字段应该和请求的地址在同一域名下,因此可以通过验证Referer字段来防御CSRF。

  检测Referer请求头防御CSRF的方法,简单易行、工作量低,仅需在服务器进行一步检测即可完成,但其防御效果却没有保证性。虽然Http协议对Referer请求头有明确的规定,但并无法保证来访浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此请求头。并且也存在攻击者攻击某些浏览器,篡改其Referer请求头的可能。

  另:防御CSRF还有一种理由校验Token的方式,服务器向浏览器客户端发放随机Token,浏览器与服务器进行交互时附带此Token,服务器验证Token的有效性。

  防盗链 与 Referer

  随着互联网应用的兴起,经常会出现这样的情况,A网站设计美观、浏览量较大,此时B网站就在网站内部引用A网站内容,来提高自身的浏览量,此时对于A网站来说,是存在利益问题。这就是一种需要防盗链的场景。

  ngx_http_referer_module通过Referer请求头来实现防盗链。需要注意的是,防盗链的实现也是一种综合策略,通过Referer来防范此种问题只是其中一种策略。

  Referer校验模块 语法及语义

  referer_hash_bucket_size

   语法:referer_hash_bucket_size size;

   语义:验证Referer头哈希表的桶大小。

  referer_hash_max_size

   语法:referer_hash_max_size size;

   语义:验证Referer头哈希表的最大值。

  valid_referers

   语法:valid_referers none | blocked | server_names | string …;

   语义:指定"Referer"请求头字段值,该值将导致将嵌入的$invalid_Referer变量设置为空字符串。否则,变量将设置为"1"。搜索匹配项不区分大小写。

   可以同时携带多个参数,表示多个referer头部都生效。

   none:允许缺失referer头部的请求访问。

   block:允许referer头部没有对应的值的请求访问。

   server_names:"Referer"请求头字段包含一个服务器名称,则允许访问。

   任意字符串:表示域名及URL的字符串,对域名可以在前缀或者后缀中含有*通配符,若referer头部的值匹配字符串后,则允许访问。

   正则表达式:第一个符号应为"~"。应当注意,表达式将与"http://"或"https://"之后的文本匹配。

  $invalid_referer

   语义:嵌入变量。空字符串,如果"Referer"请求标头字段值被视为有效,则为"1"。

  Referer校验模块 示例

  默认nginx.conf基础上进行Referer校验修改,修改如下:

worker_processes 1; error_log logs/error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name securitit; location / { # 定义Referer校验规则. valid_referers server_names *.securitit.com wwww.securitit.com/nginx ~\.csdn\.; if ($invalid_referer) { return 403; } return 200 "You have get the Content! \n"; } } }

  在进行配置时可能会遇到下图的问题,这是因为配置时丢失了if ($invalid_referer)中if后的空格导致的:

在这里插入图片描述

  下面利用curl工具进行测试:

  · 设置"Referer: http://securitit"进行访问:

在这里插入图片描述

  · 设置"Referer: http://vk.securitit.com"进行访问:

在这里插入图片描述

​  · 设置"Referer: http://www.securitit.com/nginx"进行访问:

在这里插入图片描述

  · 设置"Referer: http://www.csdn.com"进行访问:

在这里插入图片描述

  · 设置"Referer: http://www.test.com"进行访问:

在这里插入图片描述

  · 设置"http://www.kyzg.com/csdn"进行访问:

在这里插入图片描述

  从这些示例可以看出,valid_referers配置值server_names *.securitit.com wwww.securitit.com/nginx ~.csdn.,只要请求包含的"Referer"头能匹配上,那么可以正常进行请求,否则会返回指定的响应码。

  总结

  随着网络环境的开放,才会有了"防盗链",随着网络安全的重要性,才会有了"CSRF"攻击,无论是哪种技术的出现,都是在进步,为了让应用更加安全为客户服务,为了更加全面的保证开发者的利益。

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您! 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有