nginx防护拦截

1、在nginx.conf里的http{}里加上如下代码:

        limit_conn_zone $binary_remote_addr zone=perip:10m;
        limit_conn_zone $server_name zone=perserver:10m; 

2、在需要限制并发数和下载带宽的网站配置server{}里加上如下代码: 

limit_conn perserver 300; 并发限制
    limit_conn perip 25;单IP限制
    limit_rate 512k;流量限制


浏览器标识拦截

          if ($http_user_agent ~ "Apache\-HttpClient") { 
                return 444;
            }

为空

    if ($http_user_agent = '') { 
         return 444;
        }

http_user_info标识 

访问日志示意
220.181.108.10 - - [20/Jun/2022:12:26:03 +0800] "GET / HTTP/1.1" 302 5 "http://www.baidu.com" "Mozilla/5.0 (compatible; Windows NT 10.0

if ($http_referer  ~ "baidu")
{
    return 444;
}

链接拦截

if ($request_uri ~ "gid=\d{9,12}")
{
    return 444;
}

说明:\d{9,12}是正则表达式,表示9到12个数字,例如gid=1234567890就符号要求。

测试链接:
1. www.xxx.com/index.php?gid=1234567890&pid=111  匹配
2. www.xxx.com/gid=123  不匹配




并且  匹配

    set $allowphp '';
      if ( $request_uri ~ "i=11") {
           set $allowphp p;
      }
      if ( $request_uri ~ "reading_award") {
          set $allowphp "${allowphp}c";
      }
      if ( $allowphp = pc) {
          set $allowss false;
      }

      if ($allowss = false) {
      return 404;
      }

近段时间经常看到一些菠菜网站利用百度搜索逻辑来进行各种推广,比如

http://www.baidu.com/s?wd=hello1234561234.xyz.com

既浪费网站流量,又影响数据统计,所以得利用nginx进行屏蔽处理,首先建立一个block_referer.conf的文件,内容如下

map $http_referer $block_ref_urls {
    default 0;
    ~(?i)(^.*xyz.com.*$) 1;
}

屏蔽referer中带有xyz.com域名的请求,这个正则表达式根据自己的需要编写,然后在nginx.conf文件结束前include这个文件,之后便可以在vhost下自己的网站配置conf文件添加

if ($block_ref_urls) {return 403;}

当然狠一点的话直接return 444,效果更好,block_referer.conf里面可以创建多个map,这样不同的网站可以用不同的规则。


#请求这些敏感词时跳转下载10g文件

if ($request_uri ~* 
"(\.gz)|(%27)|(\.tar)|(admin)|(\.zip)|(\.sql)|(\.asp)|(\.rar)|(function)|($_GET)|(eval)|(\?php)|(config)|(%22)|(\.bak)|(")|(\\')") 
{
return 301 http://lg-dene.fdcservers.net/10GBtest.zip;
}

 屏蔽附件目录使用php

location ~* ^/(attachment|static/upload)/.*\.(php|php5)$ {deny all;}

在查看nginx日志时,经常发现一种攻击方式,
不用GET,也没用POST,而是用了一个16进制伪码:\0x01作为请求method.
其目标是使伺服器溢出,并导致了大量400 bad request包外流。

所以应付此类攻击最好的方式就是直接掐断连接。

配置方式

下面代码放进http{ }段内
map $request_method $ban_method{
    default 1;
    GET 0;
    POST 0;
}
下面代码放进server{}段内
if ( $ban_method = 1 ) {
    return 444;
}

apache版本:2.2
1.修改conf\httpd.conf文件,去掉下面内容前的#号,目的是打开重写标签

LoadModule rewrite_module modules/mod_rewrite.so

2.在conf\httpd.conf文件标签中加入

RewriteEngine on
RewriteCond %{REQUEST_URI} ^(/superUser)
RewriteRule ^(.*)$ www.baidu.com [L,R=302]

第一行表示打开重写开关
第二行为正则表达式的内容,RewriteCond标签相当于if,REQUEST_URI是请求链接,^(/superUser)表示包含"/superUser",
第三行意思是满足上面的要求,就发生链接重写,重写后的地址为"www.baidu.com

Linux apache

在.htaccess加入

    <IfModule mod_rewrite.c>
    RewriteEngine On
    #Block spider
    RewriteCond %{HTTP_USER_AGENT} "Webdup|AcoonBot|AhrefsBot|Ezooms|DataForSeoBot|Googlebot|SemrushBot|Baiduspider|YisouSpider|WangIDSpider|WBSearchBot|Wotbox|xbfMozilla|Yottaa|YandexBot|Jorgee|SWEBot|spbot|TurnitinBot-Agent|mail.RU|curl|perl|Python|Wget|Xenu|ZmEu" [NC]
    RewriteRule !(^robots\.txt$) - [F]
    </IfModule>


“在nginx怎么拒绝这样的连接,实现并且
1 请求的目标是 / 请求的方法是 POST
2 $http_user_agent  是Mozilla/5.0”
我给出的方法如下:

set $flag 0;
if ($http_user_agent = Mozilla/5\.0\.) {
    set $flag "${flag}1";
}
location = / {
    set $flag "${flag}2";
}
if ($request_method = "POST") {
    set $flag "${flag}3";
}
if ($flag = "0123") {
    return 405;
}

简单说明下:由于nginx不支持直接的多重条件判断,所以要先设置一个临时变量,满足一个条件变量值做一次变更,flag先为0,满足UA为Mozilla/5.0时变为01,满足请求/时变为012,满足POST请求时变为0123
————————————————
版权声明:本文为优快云博主「hrayha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/hrayha/article/details/64130104


cdn屏蔽

*Windows NT 5.1*|*SLCC*|*Baiduspider*|*360Spider*|*Google*|*Yahoo*|*YoudaoBot*|*Sosospider*|*Sogou*|*MSNBot*|*ia_archiver*|*Tomato*|*Windows 98*|*NET CLR*|*DigExt*|*research only*|*TencentTraveler*|*SV1*|*Android 5*|*Android 6*|*Android 4*|*Android 7*|*Android 8*|*Android 9*|*iPhone OS 10*|*iPhone OS 8*|*iPhone OS 9*|*iPhone OS 7*|*iPhone OS 11*

规则:*IE*|*^$*

结果说明:当请求来源于IE浏览器或请求头不携带User-Agent字段时,均不可访问所请求的资源。

nginx内屏蔽

Windows NT 5.1|SLCC|Baiduspider|360Spider|Google|Yahoo|YoudaoBot|Sosospider|Sogou|MSNBot|ia_archiver|Tomato|Windows 98|NET CLR|DigExt|research only|TencentTraveler|SV1|Android 5|Android 6|Android 4|Android 7|Android 8|Android 9|iPhone OS 10|iPhone OS 8|iPhone OS 9|iPhone OS 7|iPhone OS 11


宝塔cdn获取真实ip , 配置Nginx,添加代码到http内。 

set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;

自定义日志文件格式, 配置Nginx,添加代码到http内。 

第一步

log_format  zbloglog '$remote_addr [$time_local] $http_host "$request" $status "$http_referer" "$http_user_agent"';

 第二步

网站>>设置>>配置文件 把 access_log  /www/wwwlogs/xxxxx.com.log;

修改为 access_log  /www/wwwlogs/xxxxx.com.log zbloglog;


日志例子

127.0.0.1  [19/Oct/2022:21:33:37 +0800] "POST /index.php/channelApi/cloud/visit-collect HTTP/1.1"$request 200 $status  "https://servicewechat.com/wx2dsadaedf79f0/2/page-frame.html" $http_referer"Mozilla/5.0 (Linux; Android 12; V1986A Build/SP1A.210812.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.99 XWEB/4317 MMWEBSDK/20220903 Mobile Safari/537.36 MMWEBID/2202 MicroMessenger/8.0.28.2240(0x28001C55) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android"$http_user_agent

log_format可用参数:  

参数说明示例
$remote_addr客户端地址219.227.111.255
$remote_user客户端用户名称
$time_local访问时间和时区18/Jul/2014:17:00:01 +0800
$request请求的URI和HTTP协议“GET /article-10000.html HTTP/1.1”
$http_host请求地址&#xff0c;即浏览器中你输入的地址&#xff08;IP或域名&#xff09;www.ha97.com;198.98.120.87
$statusHTTP请求状态200
$upstream_statusupstream状态200
$body_bytes_sent发送给客户端文件内容大小1547
$http_refererurl跳转来源https://www.google.com/
$http_user_agent用户终端浏览器等信息“Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocolSSL协议版本TLSv1
$ssl_cipher交换数据中的算法RC4-SHA
$upstream_addr后台upstream的地址&#xff0c;即真正提供服务的主机地址10.36.10.80:80
$request_time整个请求的总时间0.165
$upstream_response_time请求过程中&#xff0c;upstream响应时间0.002


cat /www/wwwlogs/www.baidu.com.log |grep -v /web/index.php |grep -v 404 |grep .php > /root/www.baidu.com.log

<think>嗯,用户想通过Nginx配置来拦截SQL注入攻击,需要了解最佳实践。首先,我得回忆一下Nginx的相关模块和配置方法。记得Nginx可以通过ngx_http_rewrite_module模块来设置正则表达式匹配请求参数,从而拦截恶意请求。SQL注入攻击常用的字符包括单引号、分号、注释符等,可能需要用正则表达式来检测这些模式。 接下来,应该考虑哪些地方需要检查,比如GET和POST参数。GET参数在$args变量中,而POST的请求体可能需要通过$request_body来检查。不过处理POST数据可能更复杂,因为可能需要第三方模块或者Lua脚本来处理,比如使用OpenResty的Lua模块。 然后,需要编写正则表达式来匹配常见的SQL注入特征。例如,检测是否有单引号、等号、联合查询关键词如UNION、SELECT、FROM等。同时,还要注意大小写变种和混淆手段,比如使用正则表达式忽略大小写,并处理常见的编码绕过方式。 另外,配置Nginx的时候,要确保在server或location块中正确放置这些规则。当检测到恶意请求时,应该返回403或者404错误,阻止请求继续传到后端服务器。还需要注意避免误杀合法请求,所以正则表达式要尽量精确,可能需要多次测试调整。 记得用户提供的引用中有提到线程池隔离和资源分类,虽然和SQL注入防护不直接相关,但可能需要注意Nginx的线程池配置以提高处理效率,不过这可能属于性能优化范畴,暂时先专注于拦截规则。 最后,可能还需要考虑其他安全措施,比如Web应用防火墙(WAF)、定期更新规则库,以及结合应用层的参数化查询来全面防御SQL注入。需要提醒用户,Nginx的规则只是第一层防护,不能替代应用层的安全措施。</think>### 通过Nginx拦截SQL注入攻击的配置方法 #### 1. 核心拦截规则配置 在Nginx配置文件中(通常为`nginx.conf`),通过正则表达式匹配请求参数中的SQL注入特征: ```nginx server { # 定义SQL注入特征正则表达式 set $block_sql_injection 0; # 检测GET参数($args)和POST请求体(需第三方模块支持) if ($args ~* "(\<|%3C).*script.*(\>|%3E)") { set $block_sql_injection 1; } if ($args ~* "(union|select|insert|delete|update|drop|alter|truncate).*\(.*\)") { set $block_sql_injection 1; } if ($args ~* "'|\"|;|\\x22|\\x27|%27|%22") { set $block_sql_injection 1; } # 拦截并返回403错误 if ($block_sql_injection = 1) { return 403; } } ``` #### 2. 关键配置说明 - **正则表达式设计**:覆盖常见SQL注入特征,包括: - 特殊字符:`' " ; =`等 - SQL关键字:`union select`等组合 - 编码绕过:`%27`(单引号)、`%22`(双引号)等 - **匹配范围**:建议同时检查`$args`(GET参数)和`$request_body`(POST参数),后者需要`ngx_http_rewrite_module`支持[^3] - **错误响应**:建议返回403而非404,避免暴露服务器信息 #### 3. 增强防护建议 1. **请求头过滤**: ```nginx if ($http_user_agent ~* "sqlmap|nmap|w3af") { return 403; } ``` 2. **文件类型限制**: ```nginx location ~* \.(php|pl|py|jsp)$ { deny all; # 禁止直接访问脚本文件 } ``` 3. **请求长度限制**: ```nginx client_body_buffer_size 128k; client_max_body_size 1m; ``` #### 4. 最佳实践 - 配合Web应用防火墙(WAF)使用,如ModSecurity - 定期更新正则表达式规则库 - 启用Nginx日志审计: ```nginx log_format security '$remote_addr - $request $args'; access_log /var/log/nginx/sql_injection.log security; ``` - 使用OpenResty扩展Lua脚本支持更复杂的检测逻辑[^2] ### 注意事项 1. 需测试正则表达式避免误拦截合法请求 2. POST请求检测需要编译`ngx_http_rewrite_module` 3. 建议配合应用层的参数化查询实现纵深防御[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值