插件窝 干货文章 Nginx基础安全知识:防范SQL注入攻击

Nginx基础安全知识:防范SQL注入攻击

Nginx 注入 return location 306    来源:    2025-04-20

Nginx防范SQL注入攻击指南

SQL注入是Web应用最常见的安全威胁之一,作为IT工程师,了解如何在Nginx层面防范这类攻击至关重要。以下是Nginx防范SQL注入的主要策略:

1. 基础防御措施

1.1 过滤特殊字符

在Nginx配置中拦截常见SQL注入特征:

server {
    # 拦截常见SQL注入关键词
    if ($args ~* "union.*select.*\(") {
        return 403;
    }
    if ($args ~* "concat.*\(") {
        return 403;
    }
    if ($args ~* "sleep\(.*\)") {
        return 403;
    }
    # 拦截注释符和引号
    if ($args ~* "([';]+|(--)+)") {
        return 403;
    }
}

1.2 限制HTTP方法

location / {
    # 只允许GET和POST方法
    if ($request_method !~ ^(GET|POST)$ ) {
        return 405;
    }
}

2. 高级防御配置

2.1 使用ModSecurity WAF

# 安装后配置
load_module modules/ngx_http_modsecurity_module.so;

http {
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;
}

2.2 正则表达式过滤

set $block_sql_injections 0;
if ($query_string ~ "union.*select.*\(") {
    set $block_sql_injections 1;
}
if ($block_sql_injections = 1) {
    return 403;
}

3. 请求参数验证

3.1 限制参数长度

location / {
    # 限制查询字符串长度
    if ($args ~ "^(.{1000,})$") {
        return 413;
    }
}

3.2 参数白名单验证

location /api/ {
    # 只允许数字ID参数
    if ($arg_id ~ "[^0-9]") {
        return 400;
    }
}

4. 日志记录与监控

log_format security '$remote_addr - $remote_user [$time_local] '
                   '"$request" $status $body_bytes_sent '
                   '"$http_referer" "$http_user_agent" '
                   '$request_time $upstream_response_time '
                   'SQLi: $sql_injection';

map $args $sql_injection {
    default "0";
    ~* "union.*select" "1";
    ~* "([';]+|(--)+)" "1";
}

access_log /var/log/nginx/security.log security;

5. 最佳实践建议

  1. 保持Nginx更新:始终使用最新稳定版本
  2. 最小化错误信息:避免泄露数据库结构信息 nginx server { error_page 500 502 503 504 /50x.html; location = /50x.html { internal; } }
  3. 限制文件上传:防止通过上传文件进行注入 nginx location ^~ /uploads/ { client_max_body_size 10m; client_body_buffer_size 128k; # 禁止执行上传目录中的PHP等脚本 location ~ \.php$ { deny all; } }
  4. 使用HTTPS:加密数据传输
  5. 定期审计:检查Nginx配置和访问日志

注意事项

  • 这些措施应与应用程序层面的防护(如参数化查询、ORM使用等)结合使用
  • 过于严格的过滤可能导致合法请求被拦截,需根据业务调整规则
  • 生产环境部署前应在测试环境充分验证

通过以上配置,可以显著提高Nginx服务器对SQL注入攻击的防御能力。