核心是禁用execcgi并切断php解析:在directory块中设options -execcgi -includes,加php_flag engine off或removehandler .php,再用filesmatch拒绝脚本后缀,最后configtest验证后重载服务。
要禁止 apache 在指定目录中执行脚本,核心是控制 options 指令并配合模块限制,而不是单纯靠文件权限或后缀名过滤。关键在于关闭 execcgi 和禁用可能触发脚本解析的机制(如 ssi 命令执行、php 处理等)。
1. 在 Directory 容器中禁用 ExecCGI 和危险特性
编辑主配置文件(/etc/httpd/conf/httpd.conf 或 /etc/apache2/apache2.conf),在对应目录块中明确移除脚本执行能力:
- 使用
Options -ExecCGI禁用 CGI 脚本执行 - 搭配
-Includes或-IncludesNOEXEC防止服务端包含执行命令(如#exec) - 避免使用
All,改用显式白名单,例如:Options FollowSymLinks -ExecCGI -Includes
2. 确保 PHP 等解释器不在此目录生效
仅关 ExecCGI 不足以阻止 PHP 文件执行——如果 mod_php 已加载,PHP 文件仍会被解析。需额外限制:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在
<directory></directory>块中添加:php_flag engine off(适用于 mod_php) - 或更通用的方式:用
AddHandler和RemoveHandler清除关联:RemoveHandler .php .phtml .php3 .php4 - 若使用 PHP-FPM,可通过
SetHandler配合条件判断绕过,但最简做法是确保该目录不在<filesmatch></filesmatch>或ProxyPassMatch的 PHP 路由范围内
3. 阻止通过多后缀等方式绕过(防御性加固)
Apache 默认从右向左解析后缀,shell.php.jpg 可能被当作 PHP 执行。防范方法:
- 在目录配置中加入:
<filesmatch><br>Require all denied<br></filesmatch>
- 或统一拒绝所有含潜在脚本后缀的请求,无论嵌套几层
- 注意:此规则需放在
<directory></directory>内,且优先级高于全局 MIME 映射
4. 验证配置并重启服务
修改后务必检查语法并重载:
-
sudo apachectl configtest(RHEL/CentOS)或sudo apache2ctl configtest(Debian/Ubuntu) - 无误后执行:
sudo systemctl reload apache2或sudo systemctl reload httpd - 测试:放入一个
test.php,访问时应返回 403 或直接显示源码(取决于是否启用ForceType text/plain)










