代码之家  ›  专栏  ›  技术社区  ›  nickf

如何在PHP中检查可执行文件的路径是否正确?

  •  0
  • nickf  · 技术社区  · 14 年前

    /path/to/mysql-5.0/bin/mysql 或者只是 mysql "--version" 看看什么会回来。然而,我很快意识到这会导致我写这行代码:

    shell_exec($somethingAUserHasEntered . " --version");
    

    ……这显然是一件非常糟糕的事情。现在,这是一个安装脚本,它只为受信任的用户设计,并且那些可能已经有了相对较高的系统访问权限的用户,但是我仍然不认为上面的解决方案是我想写的。

    有没有更好的方法来验证可执行路径?也许是一个不会暴露巨大安全漏洞的?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Andrew Moore    14 年前

    运行任意用户命令就像运行基于用户输入的查询。。。逃跑是关键。

    is_executable()

    PHP为此公开了两个函数: escapeshellarg() escapeshellcmd() .

    escapeshellarg()

    escapeshellcmd() 转义字符串中可能用于诱使shell命令执行任意命令的任何字符。

    这应该限制风险的数量。

    if(is_executable($somethingAUserHasEntered)) {
      shell_exec(escapeshellarg($somethingAUserHasEntered) . " --version");
    }
    

    rm --version 不是很有害,而且 "rm -rf / &&" --version 会很快把你带到任何地方。


    编辑: PATH ... 下面是一个快速函数,用于根据 路径 规则:

    function is_exec($file) {
      if(is_executable($file)) return true;
      if(realpath($file) == $file) return false; // Absolute Path
    
      $paths = explode(PATH_SEPARATOR, $_ENV['PATH']);
    
      foreach($paths as $path) {
        // Make sure it has a trailing slash
        $path = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
        if(is_executable($path . $file)) return true;
      }
    
      return false;
    }
    
        2
  •  1
  •   VoteyDisciple    14 年前

    file_exists 打电话确定 某物 存在于那个地方,还有一个 is_executable

        3
  •  0
  •   RobertPitt    14 年前

    你看过吗 is_dir() is_link() is_file() is_readable()

    希望这些帮助。

        4
  •  0
  •   tstenner    11 年前

    system('which '.escapeshellarg($input))