禁用local_infile、收缩用户权限、关闭符号链接、启用审计日志是限制SQL注入破坏范围的核心基线措施;需在my.cnf中配置local_infile=0并重启,限定用户host和权限粒度,禁用skip-grant-tables,确保日志记录完整可审计。

仅靠配置安全基线无法阻止SQL注入发生,但能显著限制其破坏范围——关键在于让攻击者即使注入成功,也拿不到数据、删不了表、连不上库。
禁用 local_infile 防止文件读取类注入
攻击者常利用 SELECT ... INTO OUTFILE 或 LOAD DATA INFILE 配合注入点读取服务器敏感文件(如 /etc/passwd 或应用配置)。MySQL 默认启用 local_infile,这会让 LOAD_FILE() 等函数更易被滥用。
必须在 /etc/my.cnf 的 [mysqld] 段落中显式关闭:
local_infile=0
然后重启服务。注意:该参数在 MySQL 8.0+ 中默认为 OFF,但老旧系统或容器镜像可能未改,默认开启,务必检查。
常见错误:只改了客户端配置([client] 段),对服务端无效;或改完没重启,配置不生效。
收缩用户权限到最小必要粒度
多数注入攻击得手后,实际破坏力取决于当前数据库用户的权限。一个拥有 FILE、PROCESS、SHUTDOWN 或跨库 DROP 权限的账号,等于给攻击者配了把万能钥匙。
操作要点:
- 删除所有
Host = '%'的用户,改用具体 IP 或网段,例如'app_user'@'10.20.30.%' - 业务账号只授予对应库的
SELECT、INSERT、UPDATE,禁止DROP、CREATE、ALTER - 绝对不要给应用账号
GRANT OPTION或super_priv - 用
SHOW GRANTS FOR 'user'@'host';定期核对,避免权限随迭代膨胀
特别注意:MySQL 权限缓存不会自动刷新,执行 FLUSH PRIVILEGES; 后才生效。
关闭符号链接与跳过授权表启动
symbolic-links 和 --skip-grant-tables 是两个高危配置,前者允许通过符号链接访问任意路径下的文件(配合注入可绕过 secure_file_priv 限制),后者则直接废除所有权限校验。
检查并修正:
- 在
[mysqld]段中设置skip_symbolic_links=ON(MySQL 5.7+)或symbolic-links=0(旧版) - 确认配置文件中不存在
skip-grant-tables行;若曾用于故障恢复,事后必须手动删掉并重启 - 检查启动命令是否硬编码了该参数(如 systemd service 文件里的
ExecStart)
这两个选项一旦开启,SQL注入的后果将从“数据泄露”升级为“服务器沦陷”,且无需任何权限提升步骤。
强制错误日志与审计输出
没有日志,就等于攻击发生时你蒙着眼睛。SQL注入常伴随异常语法、报错信息回显或大量失败连接,这些都依赖日志捕获。
必须启用:
-
log-error=/var/log/mysql/error.log(写入[mysqld_safe]段) -
general_log=ON+general_log_file=/var/log/mysql/general.log(仅调试期短期开启,记录所有语句) - 生产环境推荐开启
audit_log插件(MySQL Enterprise 或 Percona Server),或使用 MariaDB 的server_audit
重点:日志路径需设为非 root 可写目录,防止攻击者覆盖或清空;日志文件权限应为 640,属主为 mysql 用户。
最容易被忽略的一点:很多企业只配了错误日志,却没配慢查询日志或通用日志,导致盲注、堆叠注入等无报错行为完全不可见。











