PHP安全配置核心目标是信息不泄露、执行受约束、会话防劫持、文件不越界:关闭expose_php/display_errors,启用log_errors;禁用危险函数,设置open_basedir和allow_url_include=Off;配置session.cookie_httponly/secure/samesite及use_strict_mode;合理限制上传、资源与超时参数。

php.ini安全配置调优不是堆参数,而是围绕“信息不泄露、执行受约束、会话防劫持、文件不越界”四个核心目标来收紧权限边界。关键不在全开或全关,而在匹配实际运行环境与业务需求。
关闭危险暴露与错误回显
生产环境必须切断攻击者的信息入口:
-
expose_php = Off:隐藏
X-Powered-By响应头,避免暴露PHP版本 - display_errors = Off:禁止将错误直接输出到页面(防止数据库结构、路径、函数调用栈等敏感信息泄露)
- log_errors = On + error_log = /var/log/php_errors.log:确保所有错误写入受控日志文件,且该路径需由Web服务用户可写、其他用户不可读
- error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED:保留关键错误和警告,过滤开发阶段才需关注的提示类信息
限制脚本执行能力与文件访问范围
即使代码被注入,也要让它“跑不出沙盒”:
- disable_functions = exec,system,passthru,shell_exec,popen,proc_open,curl_exec,pcntl_exec:禁用命令执行类函数(注意:不能替代代码层输入校验,但能大幅提高利用门槛)
-
open_basedir = /var/www/html:/tmp:限定PHP只能读写指定目录(多个路径用冒号分隔;末尾不加
/会被当作前缀匹配,易绕过) - allow_url_include = Off 和 allow_url_fopen = Off:彻底阻断远程文件包含(RCE高危入口),除非明确需要调用外部API且已做白名单校验
-
cgi.fix_pathinfo = 0:Nginx + PHP-FPM组合下必须关闭,否则可能触发路径解析漏洞(如
/upload.jpg/xxx.php被误认为PHP脚本执行)
加固会话与Cookie传输安全
防止会话被窃取或篡改:
立即学习“PHP免费学习笔记(深入)”;
-
session.cookie_httponly = 1:禁止JavaScript访问
document.cookie,缓解XSS窃取Session ID风险 - session.cookie_secure = 1:强制Cookie仅通过HTTPS传输(前提是全站启用HTTPS,否则用户无法登录)
- session.cookie_samesite = Lax 或 Strict:防御CSRF攻击,推荐Lax(兼顾兼容性与安全性)
- session.use_strict_mode = 1:拒绝使用未初始化的Session ID,防止会话固定攻击
基础防护与运行时隔离
堵住常见低级漏洞入口:
- register_globals = Off(PHP 5.4+ 已移除,旧系统仍需检查):避免GET/POST参数自动转为全局变量,杜绝变量覆盖风险
- magic_quotes_gpc = Off(已废弃,但遗留系统需确认关闭):该机制无效且干扰正常数据处理,应由应用层统一过滤
-
file_uploads = Off(若业务无需上传):直接禁用文件上传功能,消除相关攻击面;如需上传,配合
upload_max_filesize、post_max_size及后端MIME校验 -
memory_limit 和 max_execution_time 合理设限:防止恶意脚本耗尽资源,例如设为
128M和30秒(按业务实际调整)
调优完成后,务必用 php --ini 确认加载的是目标配置文件,并运行 phpinfo() 或 ini_get('disable_functions') 验证关键项生效。安全配置不是一劳永逸,需随业务变化持续复核。



















