【问题标题】:Clean directory pathname php清理目录路径名 php
【发布时间】:2013-02-04 23:59:38
【问题描述】:

基本上我想做的是:

include($_SERVER['REQUEST_URI']);

问题是,这不安全。
如果它指向 "/allowed/directory/" 或其子目录,那将是安全的。
所以我用startsWith("/allowed/directory/")来测试。

但是我仍然害怕这样的事情:

"allowed/directory/../../bad/directory"

有没有办法检查一个字符串是指向一个特定的目录还是它的
php 中的一个子目录?

(基本上应用所有 /../ - 还是我错过了另一个安全漏洞?)

【问题讨论】:

    标签: php file path


    【解决方案1】:

    PHP 函数 realpath() 应该从路径中删除 ../ ///。

    虽然你是对的,但这可能是一个相当危险的操作。 IMO 路径应限制为一组已知的字符(如“a-zA-Z_”和 / )。此外,路径字符串应限制为已知大小(如 256 个字符)。

    【讨论】:

      【解决方案2】:

      一旦你确定前缀是正确的,你可以像这样使用 preg_match:

      if(preg_match("#^[A-Za-z0-9/]+#", $string) {
          // correct
      }
      else {
          // incorrect
      }
      

      您要检查的可变部分(非静态部分)通常只是字母数字。

      只要您使用include 包含本地PHP 文件并正确验证您的输入(保持输入简单),您应该 没问题。只是要非常小心并彻底测试。您通常希望避免将用户输入传递给敏感函数,例如 include。但是对于框架,有时很难避免这种情况。

      您可以做的另一件事是拥有一个有效输入列表来进行精确比较。你可以把它放在一个 ini 文件中并用parse_ini_file 加载它。这通常是最安全的做法,只需多做一点工作。您还可以将 PHP 文件与数组一起使用,与 APC 一起使用效果更好。

      【讨论】:

      • 我现在正在使用 preg_match("#^[A-Za-z0-9/_]+\.php#", $url)。与您的非常相似,但基本上强制包含 .php 并允许下划线。感谢您的帮助。
      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2011-12-11
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多