You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何安全使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:01:02