nginx过滤sql注入

if ($request_method !~* GET|POST) { return 444; }
 #使用444错误代码可以更加减轻服务器负载压力。
 #防止SQL注入
 if ($query_string ~* (\$|'|--|[+|(%20)]union[+|(%20)]|[+|(%20)]insert[+|(%20)]|[+|(%20)]drop[+|(%20)]|[+|(%20)]truncate[+|(%20)]|[+|(%20)]update[+|(%20)]|[+|(%20)]from[+|(%20)]|[+|(%20)]grant[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]where[+|(%20)]|[+|(%20)]select[+|(%20)]|[+|(%20)]and[+|(%20)]|[+|(%20)]or[+|(%20)]|[+|(%20)]count[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]chr[+|(%20)]|[+|(%20)]mid[+|(%20)]|[+|(%20)]like[+|(%20)]|[+|(%20)]iframe[+|(%20)]|[\<|%3c]script[\>|%3e]|javascript|alert|webscan|dbappsecurity|style|confirm\(|innerhtml|innertext)(.*)$) { return 555; }
 if ($uri ~* (/~).*) { return 501; }
 if ($uri ~* (\\x.)) { return 501; }
 #防止SQL注入 
 if ($query_string ~* "[;'<>].*") { return 509; }
 if ($request_uri ~ " ") { return 509; }
 if ($request_uri ~ (\/\.+)) { return 509; }
 if ($request_uri ~ (\.+\/)) { return 509; }
 #if ($uri ~* (insert|select|delete|update|count|master|truncate|declare|exec|\*|\')(.*)$ ) { return 503; }
 #防止SQL注入
 if ($request_uri ~* "(cost\()|(concat\()") { return 504; }
 if ($request_uri ~* "[+|(%20)]union[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]and[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]select[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]or[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]delete[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]update[+|(%20)]") { return 504; }
 if ($request_uri ~* "[+|(%20)]insert[+|(%20)]") { return 504; }
 if ($query_string ~ "(<|%3C).*script.*(>|%3E)") { return 505; }
 if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") { return 505; }
 if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") { return 505; }
 if ($query_string ~ "proc/self/environ") { return 505; }
 if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") { return 505; }
 if ($query_string ~ "base64_(en|de)code\(.*\)") { return 505; }
 if ($query_string ~ "[a-zA-Z0-9_]=http://") { return 506; }
 if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") { return 506; }
 if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { return 506; }
 if ($query_string ~ "b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)b") { return 507; }
 if ($query_string ~ "b(erections|hoodia|huronriveracres|impotence|levitra|libido)b") {return 507; }
 if ($query_string ~ "b(ambien|bluespill|cialis|cocaine|ejaculation|erectile)b") { return 507; }
 if ($query_string ~ "b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)b") { return 507; }
 #这里大家根据自己情况添加删减上述判断参数。
 if ($http_user_agent ~* YisouSpider|ApacheBench|WebBench|Jmeter|JoeDog|Havij|GetRight|TurnitinBot|GrabNet|masscan|mail2000|github|wget|curl|Java|python) { return 508; }
 #同上,大家根据自己站点实际情况来添加删减下面的屏蔽拦截参数。
 if ($http_user_agent ~* "Go-Ahead-Got-It") { return 508; }
 if ($http_user_agent ~* "GetWeb!") { return 508; }
 if ($http_user_agent ~* "Go!Zilla") { return 508; }
 if ($http_user_agent ~* "Download Demon") { return 508; }
 if ($http_user_agent ~* "Indy Library") { return 508; }
 if ($http_user_agent ~* "libwww-perl") { return 508; }
 if ($http_user_agent ~* "Nmap Scripting Engine") { return 508; }
 if ($http_user_agent ~* "~17ce.com") { return 508; }
 if ($http_user_agent ~* "WebBench*") { return 508; }
 if ($http_user_agent ~* "spider") { return 508; } #拦截搜索引擎爬虫
 #拦截各恶意请求的UA,可以通过分析站点日志文件或者waf日志作为参考配置。
 if ($http_referer ~* 17ce.com) { return 509; }
 #拦截17ce.com站点测速节点的请求
 if ($http_referer ~* WebBench*") { return 509; }
 #拦截WebBench或者类似压力测试工具,其他工具只需要更换名称即可。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/weixin_37543485/article/details/132896537

<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]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值