禁用indexes不能防御lfi,因lfi是php动态包含文件,apache不拦截;需在敏感目录用php_flag engine off禁用php解析,并用require all denied封禁敏感路径及扩展名。

为什么改Options Indexes不能防住本地文件读取
禁用目录列表只是防止暴露文件结构,跟本地任意文件读取(LFI)是两回事。LFI 本质是 PHP 或其他脚本主动 include()、file_get_contents() 了不该读的路径,比如 ../../etc/passwd。Apache 配置本身不拦截这种动态包含行为——它只管“谁可以 GET 到某个 URL”,不管“PHP 脚本内部去读了什么文件”。所以光删 Indexes、加 Require all denied 对 LFI 几乎无效。
真正起效的是php_flag engine off + 目录隔离
要让 Apache 层面阻止 LFI 利用,核心思路是:在敏感目录(如 /uploads/、/files/)里彻底禁用 PHP 解析能力。这样即使攻击者构造出 ?file=../../uploads/shell.php,服务器也只会返回 PHP 源码(或 403),而不会执行它。
-
php_flag engine off必须写在对应<directory></directory>块内,或通过.htaccess生效;单独写在虚拟主机外层无效 - 若用
.htaccess,必须确保上级<directory></directory>中设了AllowOverride All,否则该文件被完全忽略 - Windows 下注意
.htaccess文件保存为 UTF-8 无 BOM 格式,记事本默认带 BOM 会导致 Apache 启动失败 - 模块名要匹配当前 XAMPP 版本:
<ifmodule mod_php7.c></ifmodule>(XAMPP 7.4+)或<ifmodule mod_php8.c></ifmodule>(新版),不确定时可省略<ifmodule></ifmodule>包裹
<filesmatch></filesmatch> 封死常见敏感路径和扩展名
攻击者常通过拼接路径绕过前端限制,直接请求 /.git/config、/config/database.php、/backup.zip 等。这类请求不经过 PHP,Apache 必须自己拦住。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在项目根目录对应的
<directory></directory>块中添加: -
<filesmatch></filesmatch>Require all denied(覆盖.git、.GIT、.git/) -
<files></files>Require all denied -
<filesmatch></filesmatch>Require all denied(按需增减) - 所有规则必须放在和
DocumentRoot完全一致的<directory></directory>块内,路径大小写、斜杠方向必须严格匹配
别漏掉 XAMPP 自带路径的二次封锁
XAMPP 的 httpd-xampp.conf 文件里预埋了多处 Require local,但它只封 /phpmyadmin、/security 这类路径,对用户自建目录完全没约束。更麻烦的是,它可能用 <locationmatch></locationmatch> 或 <directorymatch></directorymatch> 覆盖你自己的设置。
- 打开
C:\xampp\apache\conf\extra\httpd-xampp.conf,全局搜索Require local - 找到类似
<locationmatch></locationmatch>的区块 - 把里面的
Require local行注释掉(加#),不要删——留着以后快速恢复 - 如果这些路径你确实需要开放给局域网,改成
Require ip 192.168.1.0/24,而不是Require all granted - 改完必须重启 Apache,配置才生效;仅刷新浏览器毫无作用
最易被忽略的一点:XAMPP 默认允许 FollowSymLinks,而符号链接能轻易绕过所有基于物理路径的限制。如果你没业务需求,建议在所有 <directory></directory> 块中显式去掉它,或改用 Options -FollowSymLinks +SymLinksIfOwnerMatch。










