3

我正在创建一个网络服务器框架(在 Node.JS 中),并且我想将路径遍历作为内置功能包括在内,这样应用程序就不必这样做了。也许这可以成为保护路径遍历的权威指南,因此它对我以外的其他开发人员很有用。

我喜欢这段代码,因为它清楚易懂地处理跨多个操作系统的 UTF 编码字符。我认为这完全正确,但我想先和你们确认一下。

  1. 从客户端获取path,将其与查询字符串分开,并确保第一个字符是/.

  2. 如果 Path 包含%2f,则向客户端发送 HTTP 403 并停止。

  3. 运行path=decodeURIComponent(path)或等效于您的语言,如果由于输入无效而失败则跳过

  4. 为您的语言运行path=encodeURIComponent(path)等效(该函数必须只输出字符\x20-\x7e并且第一个字符必须保持为/%2f),以确保只有可打印的 ASCII 字符(根据定义,这将防止NUL字符攻击)。

  5. 具体替换%2f/. 全部替换,不区分大小写~

  6. 对我喜欢的其他字符(如+, &, =)执行相同操作 - 将列表限制为仅可打印的 ASCII 字符 ( \x20-\x7e)(为了安全),跳过%25(为了一致性)。

  7. 可以选择使用正则表达式来干净地清理路径遍历。(像/test/../bob刚刚成为的东西/bob)。确保正则表达式永远不会改变第一个字符是/.

  8. 使用以下正则表达式以一种明显的方式防止路径遍历s/\/\.?\.(?=\/|$)/\//g。(允许/..foobar/,同时阻塞/../) - 全部替换,而不仅仅是第一个!

所以你怎么看?

这些是我要解决的安全项目,但如果我需要解决另一个项目,请告诉我。

  • 防止NUL角色攻击(第 4 项)
  • 进一步防止因操作系统对扩展 Unicode 字符的处理不一致而可能发生的篡改(第 4 项)
  • 以明显/可读的方式防止路径遍历漏洞(第 8 项)
  • 防止会导致不正确的相对 URL 路径的篡改(第 2 项和第 7 项)

我注意到第 7 项假设不会发生截断,但我认为这很好。最坏的情况是/...longstuff/..foo被截断为/...longstuff/..,相当于/.(对吗?)

4

0 回答 0