【实战教程】Nginx 全方位拦截 Web 常见攻击(含目录遍历、SQL 注入等)
在 Web 安全领域,服务器层的防护是第一道防线。Nginx 作为主流的 Web 服务器,通过合理配置可有效拦截多数常见攻击(如目录遍历、SQL 注入、模板注入等)。本文将手把手教你如何通过 Nginx 配置构建基础安全防护体系,覆盖各类主流攻击场景。
一、攻击场景与防护目标
在实际业务中,我们常遇到以下攻击类型,本文将针对这些场景实现防护:
目录遍历攻击
例:/?errfile=…/…/…/…/etc/passwd
攻击者通过构造特殊路径,试图访问服务器敏感文件(如 /etc/passwd、windows/win.ini)。
SQL 注入攻击
例:/?id=1’ AND (SELECT 1 FROM (SELECT(SLEEP(10)))a)–
攻击者通过注入 SQL 语句,窃取或篡改数据库数据(含延时盲注等进阶手段)。
模板引擎注入
例:/?backurl=…{pboot:if((get_lg…)}
针对 CMS 模板引擎(如 PbootCMS)的注入攻击,试图执行恶意代码。
开放重定向攻击
例:/?redirect=…%2f…%2fwindows/win.ini
攻击者通过构造跳转参数,诱导用户访问恶意网站。
其他常见攻击
如 XSS 跨站脚本、命令注入、SSRF 服务器端请求伪造等。
二、Nginx 安全配置核心思路
Nginx 防护的核心逻辑是 「特征识别 + 规则拦截」,通过以下手段实现:
攻击特征映射:用 map 指令预处理请求参数,标记含攻击特征的请求。
参数精细化过滤:针对敏感参数(如 id、redirect)单独设置拦截规则。
敏感路径拦截:直接禁止访问系统敏感文件 / 目录(如 .git、/etc/)。
安全响应头:通过 HTTP 头限制(如 CSP、X-XSS-Protection)增强浏览器防护。
三、实战配置步骤
# =========================
# 1. 全局安全配置(http块)
# =========================
http {# 性能优化server_names_hash_bucket_size 128;client_max_body_size 10m;client_body_buffer_size 128k;# 攻击特征映射(高效预处理)map $args $is_malicious {default 0;# 1. SQL注入攻击"~*(?i)(\bunion\b|\bselect\b|\binsert\b|\bupdate\b|\bdelete\b|\bdrop\b|\balter\b|\btruncate\b|\bwhere\b|\bjoin\b|\bsleep\(|benchmark\(|pg_sleep|waitfor\(\s*delay\s*\))" 1;# 2. XSS跨站脚本攻击"~*(?i)(<script|javascript:|onerror=|onload=|alert\(|document\.cookie)" 1;# 3. 目录遍历攻击"~*(\.\./|\.\.\\|%2E%2E%2F|%2E%2E%5C|/etc/passwd|/proc/|windows/win.ini)" 1;# 4. 命令注入攻击"~*(?i)(;|`|\||&|%7C|%60|%3B|system\(|exec\(|passthru\(|shell_exec\(|popen\()" 1;# 5. SSRF服务器端请求伪造"~*(?i)(localhost|127\.0\.0\.1|internal|192\.168|10\.0\.0|172\.1[6-9]|172\.2[0-9]|172\.3[0-1])" 1;# 6. 代码注入攻击"~*(?i)(eval\(|assert\(|phpinfo\(|file_get_contents|include|require|fopen|unlink|mkdir)" 1;# 7. 模板注入攻击(如PbootCMS)"~*(\{pboot:if|get_lg\(|get_backurl\()|(\}\s*[0-9a-zA-Z]+\s*\{/pboot:if\})" 1;# 8. 敏感文件泄露"~*(?i)(\.git|\.svn|\.env|\.htaccess|\.bak|\.log|\.sql|\.old|\.conf|\.key|\.crt)" 1;}# 9. 敏感参数专项过滤map $arg_id $id_malicious {default 0;"~*(?i)('|--|%27|%2D%2D|sleep|benchmark|union|select|insert|delete|drop)" 1;}map $arg_redirect $redirect_malicious {default 0;"~*(?i)(\.\./|http|https|javascript:|data:|ftp:|//)" 1; # 防止开放重定向}map $arg_file $file_malicious {default 0;"~*(?i)(\.php|\.sh|\.pl|\.cgi|\.exe|\.asp|\.aspx|/etc/|/proc/|windows/)" 1;}# 10. User-Agent检测(识别扫描器和恶意爬虫)map $http_user_agent $bad_agent {default 0;"~*(?i)(sqlmap|wget|curl|python|nikto|nmap|masscan|havij|loadimpact|fimap|metasploit)" 1;}# 11. Referer检测(防止CSRF和恶意来源)map $http_referer $bad_referer {default 0;"~*(?i)(spam|sex|porn|casino|drugs)" 1; # 自定义黑名单}
}# =========================
# 2. 服务器安全配置(server块)
# =========================
server {listen 80;server_name your_domain.com; # 替换为你的域名# 安全响应头add_header X-Frame-Options "SAMEORIGIN"; # 防止点击劫持add_header X-Content-Type-Options "nosniff"; # 防止MIME类型嗅探add_header X-XSS-Protection "1; mode=block"; # XSS防护add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:"; # CSP策略add_header Referrer-Policy "strict-origin-when-cross-origin"; # 引用来源策略add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"; # HSTS(仅HTTPS)# 禁用不必要的HTTP方法if ($request_method !~ ^(GET|POST|HEAD)$ ) {return 405;}# 拦截恶意请求if ($is_malicious = 1) {return 403;}if ($id_malicious = 1) {return 403;}if ($redirect_malicious = 1) {return 403;}if ($file_malicious = 1) {return 403;}if ($bad_agent = 1) {return 403;}if ($bad_referer = 1) {return 403;}# 禁止访问敏感目录和文件location ~* (/\.git|/\.svn|/\.env|/\.htaccess|/etc/|/proc/|/var/log|windows/|config\.php|db\.conf) {return 403;}# 防止文件包含漏洞location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;# 限制PHP可执行目录(可选)if ($document_root$fastcgi_script_name !~ ^/var/www/html/) {return 403;}}# 限制上传文件类型(可选)location ~* \.(php|php3|php4|php5|phtml|pl|cgi|py|asp|aspx|sh|exe|dll)$ {if ($request_uri ~* "/uploads/|/files/") { # 上传目录return 403;}}# 防止目录列表泄露autoindex off;# 错误页面配置error_page 400 /errors/400.html;error_page 403 /errors/403.html;error_page 404 /errors/404.html;error_page 500 /errors/500.html;location = /errors/400.html { root /var/www/html; internal; }location = /errors/403.html { root /var/www/html; internal; }location = /errors/404.html { root /var/www/html; internal; }location = /errors/500.html { root /var/www/html; internal; }
}
验证配置有效性
检查配置语法:
执行 nginx -t 确保配置无语法错误。
重启 Nginx:
执行 systemctl restart nginx 或者 ./nginx -s reload 使配置生效。
测试拦截效果:
访问含攻击特征的 URL(如 http://your_domain.com/?id=1’ AND SLEEP(10)–),应返回 403。
测试正常业务请求,确保未被误拦截。
注意事项与优化建议
避免过度拦截
若正常业务中需使用某些特殊字符(如 &、=),可微调正则表达式(例如用 \b 限定关键词边界,避免误判)。
日志监控
配置 Nginx 日志记录拦截的请求,便于分析攻击来源:
log_format security '$remote_addr [$time_local] "$request" $status';
access_log /var/log/nginx/security.log security;
结合应用层防护
Nginx 拦截是第一道防线,应用层仍需做好:
输入验证(如强制参数类型为整数);
使用预处理语句防止 SQL 注入;
模板引擎变量转义。
定期更新规则
新攻击手段层出不穷,需定期更新 Nginx 防护规则(如新增新兴攻击特征)。
总结
通过本文的配置,Nginx 可有效拦截目录遍历、SQL 注入、模板注入等常见攻击,为 Web 应用构建基础安全屏障。但安全防护是多层体系,需结合应用层编码规范、WAF 等工具,形成「纵深防御」体系,才能最大限度降低安全风险。