关闭错误回显是防御报错型SQL注入最直接有效的措施,需在php.ini中设display_errors=Off、log_errors=On且error_log指向Web不可访问路径,仅ini_set无效。

关闭错误回显,防止数据库结构暴露
SQL注入成功后,攻击者常靠报错信息反推表名、字段名甚至数据内容。PHP默认会把MySQL错误直接输出到页面,比如 Unknown column 'password' in 'field list' 这类提示,等于帮对方画好攻击地图。
必须在 php.ini 中关掉它:
-
display_errors = Off(生产环境绝对禁用) -
log_errors = On(确保错误写入日志) -
error_log = /var/log/php/error.log(路径需设为Web无法访问的目录)
注意:仅靠 ini_set('display_errors', '0') 不可靠——某些致命错误仍可能绕过运行时设置直接输出,必须从配置层堵死。
限制脚本可访问范围,阻断横向渗透
一旦SQL注入得手,攻击者常尝试读取配置文件(如 config.php)获取数据库密码,或遍历其他站点目录。用 open_basedir 能有效收缩攻击面。
示例配置:
open_basedir = /var/www/example.com/:/tmp/
关键点:
- 路径末尾必须带斜杠
/,否则可能被绕过 - 要显式包含临时目录(如
/tmp/),否则upload_tmp_dir或 session 文件操作会失败 - 多个路径用冒号分隔(Linux)或分号(Windows),不能留空格
如果应用依赖 Composer autoload 或第三方 SDK,记得把它们的安装路径也加进去,否则 require 会报错。
禁用危险函数,切断shell逃逸链
SQL注入只是起点,攻击者拿到查询结果后,往往接着调用 system()、exec() 或 file_get_contents() 读取敏感文件。这些函数在多数Web场景中根本不需要。
在 php.ini 中明确禁用:
disable_functions = system,exec,passthru,shell_exec,proc_open,popen,pcntl_exec,dl
特别注意:
-
dl()在 PHP 8.0+ 已废弃,但旧版本仍需禁用 - 禁用
file_get_contents()会影响正常业务(如读取本地配置),建议只禁用curl_exec()和远程文件函数更稳妥 - 若用了 Laravel 或 Symfony,检查是否依赖
proc_open()(如队列驱动),禁用前先验证
关闭PHP版本与扩展信息泄露
HTTP响应头里的 X-Powered-By: PHP/8.2.12 和 Server: Apache/2.4.52 是攻击者的侦察工具。版本号越具体,越容易匹配已知漏洞利用链。
两处关键配置:
-
expose_php = Off(移除X-Powered-By头) -
server_tokens off(Apache配置项,非 php.ini,但必须配套设置)
别忽略 phpinfo() —— 开发时留下的调试页是高危入口。上线前务必删除所有 *.phpinfo* 文件,并在 php.ini 中加入:
disable_functions = phpinfo
真正难防的不是注入本身,而是注入成功后,错误信息、文件权限、函数滥用和版本指纹连成一条完整的攻击路径。每一道配置都是在给这条路径砌墙,少砌一块,整面墙就形同虚设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











