核心是切断攻击者跳出web根目录的能力,并堵住程序层面对用户输入路径的盲目信任:apache禁用目录浏览、nginx精准location拦截、代码层用realpath()+白名单校验,配合最小权限与waf防护。

防止目录遍历与任意文件读取,核心是切断攻击者“跳出Web根目录”的路径能力,并堵住程序层面对用户输入路径的盲目信任。不是单靠某一条配置就能解决,而是服务器配置、权限控制、代码逻辑三者协同。
Apache:禁用目录浏览 + 限制路径解析
目录浏览(Directory Listing)和目录遍历(Path Traversal)虽不同,但常共存。先关掉前者,再防后者:
- 在
<directory></directory>块中明确禁用索引:Options -Indexes。例如:<directory><br> Options -Indexes +FollowSymLinks<br> AllowOverride None<br> Require all granted<br></directory>
访问/uploads/若返回 403,说明生效。 - 隐藏版本号,减少信息泄露:
在主配置中添加ServerTokens Prod和ServerSignature Off,避免暴露 Apache 版本细节。 - 禁止解析危险路径模式:用
mod_rewrite或mod_security拦截含../、~、%2e%2e%2f等特征的请求。例如 rewrite 规则:RewriteCond %{THE_REQUEST} \.\./ [NC]<br> RewriteRule ^ - [F,L]
Nginx:精准 location 控制 + 路径规范化
Nginx 没有内置的“目录列表开关”,但可通过 location 精准拦截非法路径:
- 在 server 块中加入防御性 location:
location ~ /\.\. { deny all; }
这能拦住 URL 中显式出现..的请求,包括编码变体需配合underscores_in_headers on;和更严格的正则(如匹配%2e%2e)。 - 强制路径归一化:使用
alias替代root处理静态资源时,确保路径不拼接用户输入;若必须用root,配合try_files $uri =404;避免意外回退。 - 关闭版本标识:
server_tokens off;放在 http 或 server 块内,重启前用nginx -t校验。
系统与应用层:最小权限 + 白名单校验
服务器配置只是第一道门,真正关键在后端代码和文件系统权限:
- Web服务运行用户(如 www-data)仅对网站根目录及其子目录有读取权限,严禁赋予
/etc、/var/log等敏感路径访问权。执行:chown -R www-data:www-data /var/www/html<br> chmod -R 755 /var/www/html
- 所有涉及文件读取的功能(如
?file=xxx),必须做白名单校验:
不允许直接拼接用户输入;优先用 ID 映射文件名(如id=5 → report.pdf);若必须传文件名,只允许字母、数字、下划线、点号,并严格检查扩展名(如仅限.pdf,.jpg)。 - 代码中调用路径函数时,务必用
realpath()(PHP)、Paths.get().toRealPath()(Java)等解析绝对路径,再比对是否落在允许目录内(如/var/www/html/开头)。
增强防护:WAF + 主动检测
配置加固之后,加一层运行时防护更稳妥:
- 部署 Web 应用防火墙(如 ModSecurity、阿里云 WAF、Cloudflare),启用“目录遍历规则集”,自动封禁高频尝试
../的 IP。 - 定期用工具扫描验证:
使用nikto -h http://example.com检查目录浏览;
用burp suite手动测试文件参数(如?img=../../etc/passwd)是否被拦截或返回 403/404。 - 禁用不必要的模块:如 Apache 的
mod_userdir、mod_include(SSI),Nginx 的autoindex on,除非业务强依赖。










