核心是切断php不当执行路径并实现站点级隔离:先通过phpinfo()确认mod_php或php-fpm模式,前者需降apache用户权限,后者应为每站配独立pool用户;上传目录必须用php_flag engine off或filesmatch+require all denied禁用解析;open_basedir须在虚拟主机中按站配置白名单,末尾加斜杠且包含/tmp等必要路径;.php文件权限设644,敏感文件移出web根目录设600,并禁用system等危险函数。

安全配置 Apache 隔离 PHP 脚本执行权限,核心不是“给 Apache 加限制”,而是切断 PHP 在不该执行的地方被解释的路径,并让每个站点在系统级和 PHP 层都拥有独立、最小化的运行边界。
明确 PHP 运行模式,决定权限控制起点
先确认当前是 mod_php 还是 PHP-FPM:查看 phpinfo() 中的 “Server API”,显示 apache2handler 是 mod_php,fpm-fcgi 是 PHP-FPM。两者权限控制逻辑完全不同:
- mod_php 下,PHP 完全继承 Apache 工作进程的 UID/GID(如 www-data),降权必须从 Apache 启动用户入手,比如新建专用用户
php-web1并在 httpd.conf 中设User php-web1 - PHP-FPM 更推荐:每个虚拟主机对应一个独立 pool,单独指定
user = web1和group = web1,这样即使一个站被攻破,也无法读取其他站的配置文件
上传目录必须禁用 PHP 解析
用户可写目录(如 /var/www/html/uploads)是高危区,绝不能让其中的 .php 文件被执行。两种可靠方式任选其一:
- 在 Apache 虚拟主机或主配置中加入:
<directory><br> php_flag engine off<br></directory>
- 或更彻底地拒绝所有 PHP 请求:
<directory><br> <filesmatch><br> Require all denied<br> </filesmatch><br></directory>
注意(?i:...)支持大小写不敏感匹配,防绕过
用 open_basedir 实现路径级隔离
这是 PHP 层最基础的白名单机制,但必须配合用户隔离才真正有效:
- 不要只在 php.ini 全局设一个大白名单(如
open_basedir = "/var/www:/tmp"),否则所有站点都能跨目录访问 - 应在每个虚拟主机配置块中用
php_admin_value open_basedir单独限定:php_admin_value open_basedir "/var/www/web1:/tmp:/var/www/web1/runtime" - 路径末尾要加斜杠(
/var/www/web1/),避免/var/www/web123被误放行;临时目录(/tmp)、会话目录、Composer 缓存等必须显式包含,否则上传、登录、依赖安装会失败
文件系统权限与 Apache 配置协同加固
权限设置要和运行逻辑一致,避免矛盾:
- .php 源码文件统一设为
644(所有者读写,组和其他人只读),Apache 不需要执行位;敏感配置文件(如db.php)移出 Web 根目录并设为600 - 确保上传目录本身无执行权限(Linux 下目录执行位表示“可进入”,不影响 PHP 执行,但配合
php_flag engine off可形成双重保险) - 禁用危险函数(在 php.ini 或 pool 配置中设
disable_functions = system,exec,passthru,shell_exec,proc_open),尤其 PHP-FPM 模式下默认未禁用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











