核心是严格分离可执行与静态资源:禁用全局脚本处理器,仅在明确目录启用php;上传目录强制二进制类型并禁止处理器;关闭multiviews,显式拒绝危险后缀;优先后端设content-type,实测验证配置生效。

核心思路是:**不给非预期内容赋予可执行 MIME 类型,同时避免让可执行扩展名被错误识别为静态资源**。Apache 本身不执行代码,但若配置不当(比如把用户上传的 .php 文件当成 text/plain 发送),配合其他模块或浏览器行为,就可能绕过安全边界。真正的风险点在于 AddHandler、AddType 和文件后缀处理逻辑的组合失控。
只允许明确声明的可执行类型
禁用全局脚本处理器,改用显式、最小化范围的配置:
- 在主配置中注释或删除类似
AddHandler php7-script .php的宽泛指令 - 仅在确需 PHP 执行的目录下,用
<directory></directory>块启用:
AddHandler application/x-httpd-php .php
- 对上传目录(如
/uploads/)强制禁止任何处理器:
<directory><br> RemoveHandler .php .phtml .phar<br> AddType application/octet-stream .php .phtml .phar<br> </directory>
隔离静态资源与可执行路径
防止攻击者通过路径遍历或重写规则“伪装”脚本为静态文件:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 禁用
MultiViews—— 它会根据 Accept 头自动匹配后缀,可能把shell.jpg.php当成shell.jpg返回,绕过扩展名校验 - 在关键位置添加:
Options -MultiViews - 用
FilesMatch显式拒绝可疑组合:
Require all denied
对用户可控内容强制二进制类型
上传文件、日志、导出数据等,绝不依赖浏览器渲染:
- 用
AddType application/octet-stream覆盖常见危险后缀,确保下载而非执行 - 对无后缀或动态生成的响应,优先在后端脚本里设
header('Content-Type: application/octet-stream'),比 Apache 层更可靠 - 避免使用
text/plain处理用户提交内容 —— 某些旧浏览器会尝试解析其中的 HTML/JS 片段
验证与兜底措施
配置生效后必须实测,不能只看配置文件是否保存:
- 用
curl -I https://yoursite/uploads/test.php确认返回的是Content-Type: application/octet-stream,且状态码为 200(不是 403/404) - 检查
mod_mime_magic是否启用 —— 若开启,它会基于文件内容推断类型,可能覆盖你设的AddType;生产环境建议关闭 - 定期扫描配置中是否存在
AddType text/html .php或AddHandler default-handler .js这类高危组合










