关闭phpinfo()和限制PHP文件目录访问权限是PHP加固最基础关键的两步:前者防信息泄露,后者防路径遍历与越权读取;需禁用phpinfo()调用、配置open_basedir、禁止Web直接访问敏感目录,并规范文件权限为644/755。

关闭 phpinfo() 和限制 PHP 文件所在目录的访问权限,是 PHP 环境加固中最基础也最关键的两步。前者防信息泄露,后者防路径遍历与越权读取——两者都无需复杂改造,但漏掉任何一个,都可能让攻击者轻松拿到服务器指纹、配置细节甚至数据库凭证。
彻底禁用或屏蔽 phpinfo()
phpinfo() 会完整暴露 PHP 版本、扩展列表、$_SERVER 变量、已加载的 ini 文件路径、环境变量,甚至临时目录和 Web 根路径。攻击者可据此精准选择漏洞利用链(如针对特定版本 opcache 或 gd 扩展的 CVE)。
- 在
php.ini的disable_functions中移除phpinfo—— 如果它已被列入,直接删掉即可;若未列,不需额外添加 - 更稳妥的做法是:删除所有含
phpinfo()调用的文件(如phpinfo.php、info.php、test.php),用命令快速扫描:find /var/www -name "*.php" -exec grep -l "phpinfo()" {} \; 2>/dev/null - 即使保留调试用文件,也必须通过 Web 服务器层拦截访问:
Apache:<FilesMatch "(phpinfo|info|test)\.php$">Require all denied</FilesMatch>
Nginx:location ~* ^/(phpinfo|info|test)\.php$ { return 403; }
限制 PHP 文件可访问的目录范围
仅靠 Linux 文件权限无法阻止 PHP 脚本读取系统任意路径(比如 include '../config/database.php')。真正起效的是 open_basedir —— 它强制所有文件操作(file_get_contents、include、fopen 等)只能在指定目录内进行。
- 在
php.ini或 PHP-FPM 池配置中设置:open_basedir = /var/www/html/your_site/:/tmp/:/usr/share/php/
多个路径用英文冒号分隔,末尾加斜杠更安全;务必包含/tmp/,否则上传、会话、缓存等功能异常 - 每个虚拟主机应使用独立的
open_basedir,避免共用同一 PHP 进程时跨站越权 - 验证是否生效:写一个测试脚本调用
file_get_contents('/etc/passwd'),若报错failed to open stream: Operation not permitted,说明限制已起作用
禁止 Web 直接访问敏感目录和文件
PHP 层的 open_basedir 不影响用户通过 URL 访问文件。如果 /config/ 目录被放在 Web 根下又没做防护,攻击者可直接下载 config/database.php。
立即学习“PHP免费学习笔记(深入)”;
- Apache:在
/config/目录下新建.htaccess,内容为:Deny from all或Require all denied - Nginx:在
server块中添加:location ^~ /config/ { deny all; }
注意该规则要放在location ~ \.php$之前,否则会被覆盖 - 对存放上传文件的
/uploads/等目录,同样禁止执行 PHP:
Nginx 示例:location ~ ^/uploads/.*\.php$ { return 403; }
补充:文件权限与所有权规范
Linux 权限不是摆设。错误的权限设置会让加固前功尽弃。
- PHP 脚本文件统一设为
644(所有者可读写,组和其他只读) - 目录统一设为
755(所有者可读写执行,组和其他可读执行) - Web 进程用户(如
www-data或nginx)应为文件属主或属组,**绝不能用 root 运行 PHP 或拥有网站文件** - 检查命令:
find /var/www/html -type f -not -perm 644 -ls和find /var/www/html -type d -not -perm 755 -ls



















