phpenv默认开启目录浏览,需手动关闭:修改apache配置中options indexes为options -indexes并重启服务,或在敏感目录添加.htaccess写入options -indexes deny from all。

phpEnv 默认开启目录浏览,必须手动关
phpEnv 是 Windows 下的轻量 PHP 环境套件,底层用的是 Apache + PHP,但默认 Options Indexes 是开启的——这意味着用户直接访问 /uploads/ 或 /config/ 这类无首页的目录时,会直接列出所有文件,暴露结构甚至敏感文件(如 .env、database.php)。这不是 PHP 本身的问题,而是 Apache 的默认行为。
- phpEnv 的 Apache 配置文件路径通常是:
C:\phpEnv\Apache\conf\httpd.conf(或子目录下的vhosts.conf) - 搜索
Options Indexes,找到类似这一行:Options Indexes FollowSymLinks - 把它改成:
Options -Indexes FollowSymLinks(注意前面的减号) - 保存后,必须重启 Apache:在 phpEnv 控制台点【Restart Apache】或运行
httpd -k restart
在敏感目录里放 .htaccess 比改全局配置更稳妥
改 httpd.conf 影响整个服务器;而用 .htaccess 可以按目录精细控制,且 phpEnv 完全支持(只要 Apache 启用了 mod_rewrite 并设置了 AllowOverride All —— phpEnv 默认已满足)。
- 进入你要保护的目录,比如
C:\phpEnv\www\myapp\config\ - 新建文件,命名为:
.htaccess(注意开头的点,Windows 资源管理器可能提示“不能以点开头”,用记事本另存为时手动输入完整文件名) - 写入这两行:
Options -Indexes<br>Deny from all
-
Deny from all会直接拒绝对该目录下所有资源的 HTTP 访问(包括config.php),比只关索引更彻底 - 如果只想禁止执行 PHP 但允许下载
.log或.txt,换成:<filesmatch><br> Deny from all<br></filesmatch>
PHP 层面不校验路径,Web 服务器再严也白搭
就算你把 /config/ 用 .htaccess 锁死了,只要 PHP 代码里写了 include $_GET['f'] . '.php';,攻击者仍可能通过 ?f=../config/database 绕过 Web 服务器限制,直接读取文件。phpEnv 本地开发环境尤其容易忽略这点——因为没上 WAF、没日志监控,漏洞藏得深。
- 永远不用用户输入拼接路径:删掉类似
file_get_contents('logs/' . $_GET['name'])这种写法 - 必须用
basename()+realpath()双重校验:$target = realpath('templates/' . basename($_GET['tpl']));<br>if ($target === false || strpos($target, __DIR__ . '/templates/') !== 0) {<br> http_response_code(403); exit;<br>} -
realpath()返回false时一定要检查,否则strpos()会对false做字符串操作,结果不可控 - phpEnv 的
php.ini里建议打开open_basedir:设为open_basedir = C:\phpEnv\www\;C:\phpEnv\tmp\,能拦住大部分跨目录读取
别信“chmod 000”这种伪安全方案
有人在 phpEnv 里对 config/ 执行 chmod("C:/phpEnv/www/myapp/config", 0000),以为这样 PHP 就读不了——错。Windows 下 chmod() 在 NTFS 上基本无效,Apache 进程(通常以当前登录用户身份运行)仍可通过系统权限读取。而且这种操作会让正常开发卡住,比如 Composer 更新失败、缓存写入报错。
- 真正的权限控制靠三件事:Web 服务器规则(
.htaccess/httpd.conf)、PHP 路径校验(realpath()+ 白名单)、文件存放位置(把.env移到C:\phpEnv\www\外面) - phpEnv 的 www 根目录外,还有个
C:\phpEnv\php\和C:\phpEnv\mysql\,这些地方 Web 服务默认无法访问,适合放真正敏感的配置 - 如果用了
file_put_contents()写日志,确保日志目录不在 Web 可达路径下,否则可能被直接下载
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











