如何安全使用File.read处理用户路径,防范路径遍历攻击?
路径遍历攻击防护:直接去除".."是否足够?
直接去掉路径里的".."绝对不安全,这种方法漏洞太多:
- 攻击者可以用URL编码后的路径(比如
%2e%2e/),你直接删".."根本识别不了,解码后还是能往上跳目录 - 不同操作系统有特殊路径写法,比如Windows下的
..\,或者类似....//这种变种,去掉中间的".."后剩下./,照样能绕开限制 - 还可以利用系统的符号链接,即使路径里没
"..",也能指向根目录外的文件
正确的防护方式是解析路径后做根目录归属校验,以Ruby为例:
# 先把根目录转成绝对路径 root_dir = File.expand_path("~/Public") # 拼接用户请求的路径 requested_path = File.join(root_dir, params[:path]) begin # 解析成真实的绝对路径(会自动处理符号链接、相对路径) absolute_path = File.realpath(requested_path) # 校验该路径是否在根目录范围内 if absolute_path.start_with?(root_dir) # 合法,读取文件返回 File.read(absolute_path) else # 非法,返回权限错误 [403, {}, ["Forbidden"]] end rescue Errno::ENOENT # 文件不存在,返回404 [404, {}, ["Not Found"]] end
核心是用系统原生的路径解析方法处理相对路径和符号链接,再严格校验路径是否属于根目录的子范围。
至于要不要用Nginx:
- 如果你的服务只是单纯提供静态文件,直接用Nginx这类成熟的静态服务器是最优解,它们内置了完善的路径遍历防护,不用自己写代码处理各种边缘情况。
- 但如果你的Web服务器有自定义业务逻辑,必须自己实现上述的安全校验逻辑,不能依赖单纯删除
".."这种不靠谱的方法。
内容的提问来源于stack exchange,提问作者max pleaner
相关产品推荐
相关产品推荐

