分层设防是核心思路:代码层用预处理语句、输入校验、禁用危险函数、安全上传;服务器层用nginx拦截sql注入和xss关键词;数据库层限权;运维层统一管控权限。

核心思路是分层设防:代码层堵住入口,服务器层拦截异常,数据库层限制破坏力,运维层收口管理权限。单靠某一层容易被绕过,必须多层联动。
代码层:切断注入源头
所有用户输入都必须视为不可信数据,不能拼接、不能直用。
- 数据库操作一律用预处理语句(如 PDO::prepare / MySQLi::prepare),杜绝字符串拼接 SQL
- 前端传来的参数,在进入业务逻辑前就做类型校验和长度限制(例如 ID 必须为正整数,邮箱必须匹配 RFC 格式)
- 禁用危险函数:在 php.ini 中设置 disable_functions = eval,exec,passthru,shell_exec,system,proc_open,popen,assert
- 文件上传必须重命名(不保留原始文件名)、校验 MIME 类型与扩展名双重白名单、保存路径设在 Web 根目录外、文件权限设为 644
Web 服务器层:用 Nginx 做第一道网关
Nginx 不是万能的,但能快速拦掉大量低级攻击流量。
- 在 server 或 location 块中加入 SQL 注入关键词拦截规则:
if ($request_uri ~* "(union|select|insert|update|delete|drop|alter|truncate|--|'|;|\/\*|\*\/)") { return 403; } - 防御 XSS:过滤常见脚本特征:
if ($args ~* "(<script return></script> - 严格校验 Host 头,只允许可信域名:
if ($host !~ ^(localhost|yourdomain\.com|www\.yourdomain\.com)$) { return 444; }(444 是 Nginx 特有静默关闭连接状态码) - 关闭敏感响应头:
server_tokens off;
proxy_hide_header X-Powered-By;
数据库层:权限最小化 + 错误隐藏
即使被注入,也要让攻击者拿不到更多东西。
- 应用连接数据库的账号,只授予必要权限(例如仅 SELECT/INSERT,禁用 DROP、ALTER、FILE、PROCESS)
- 开启 sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,增强输入容错性
- 禁止错误信息回显:PHP 中设 display_errors = Off,MySQL 中避免将报错内容直接输出到页面
- 敏感表字段(如密码、手机号)启用 AES 加密存储,传输全程走 TLS 1.2+
运维与配置加固
很多漏洞其实来自疏忽,而非技术短板。
- 启用 open_basedir 限制 PHP 脚本能访问的目录范围,防止跨目录读取
- 设置 allow_url_include = Off 和 allow_url_fopen = Off,杜绝远程文件包含(RFI)
- 部署 ModSecurity 或云 WAF,加载 OWASP CRS 规则集,自动识别变形注入(如大小写混写、URL 编码绕过)
- 定期轮换数据库账号密码与 API 密钥,所有密钥不硬编码,通过环境变量或密钥管理服务注入











