【问题标题】:How to use $_GET path with file_exists and keep it safe?如何将 $_GET 路径与 file_exists 一起使用并保持安全?
【发布时间】:2012-09-29 19:13:13
【问题描述】:

我有一个函数可以通过 jQuery 检查文件是否存在,该函数会调用 PHP 脚本,在单击索引页面上的按钮更改某些图像时,我将使用该脚本。

jQuery 函数:

function fileExists(path){
    $.getJSON("/ajax/fileExists.php",{ path: path },
    function (data){
        return data.path;
    });
}

fileExists.php:

$path=$_SERVER['DOCUMENT_ROOT'].'/packs'.$_GET['path'];

if(file_exists($path)){
    echo json_encode(TRUE);
}else{
    echo json_encode(FALSE);
}

我担心人们使用此脚本列出我可能不希望他们知道的服务器或文件的内容,因此我使用 DOCUMENT_ROOT 和 /packs 来尝试限制对该目录的调用,但我认为人们可以简单地在提供的路径中使用 ../ 来检查替代方案。

确保安全的最佳方法是什么,最好将其限制在 /packs 中,还有其他我应该担心的问题吗?

编辑:javascript/jQuery 中的示例调用:

if( fileExists('/index.php') ){
    alert('Exists');
}else{
    alert('Doesn\'t exist');
}

【问题讨论】:

  • 假设您控制要显示的图像,为什么需要检查它们是否存在?
  • 我在现有的 jQuery 函数中使用它,该函数允许用户从下拉列表中选择纹理包,然后用所述选定纹理包中的图像替换所有现有图像。此功能旨在阻止它显示不存在的图像。您可以在 www.texturepacker.net 上看到它的运行情况,尽管代码与上面的不同。
  • 旁注:您当前的函数将始终返回undefined,因为getJSON 是异步的。所以你的if 语句也不起作用。查看 jQuery Deferreds,它应该可以帮助您解决这个问题。

标签: php javascript jquery ajax get


【解决方案1】:

这就是我过去的处理方式:

$path = realpath($_SERVER['DOCUMENT_ROOT'].'/packs'.$_GET['path']);
if (strpos($path, $_SERVER['DOCUMENT_ROOT']) !== 0) {
    //It's looking to a path that is outside the document root
}

【讨论】:

    【解决方案2】:

    您可以从文件名中删除任何路径转换:

    $path_arr = explode("/", $_GET['path']);
    $path = $path_arr[count($path_arr - 1)];
    

    这种做法适度安全且快速(O(1) 复杂度),但并不是最好的做法,因为您必须注意编码、字符替换和所有类似的事情。

    但总体最佳实践(虽然速度较慢取决于您的目录大小,假设复杂度为 O(n))是使用 readdir() 获取 /packs 目录中所有文件的列表,然后查看是否提供的文件名存在:

    $handle = opendir($path=$_SERVER['DOCUMENT_ROOT'].'/packs');
    while (false !== ($entry = readdir($handle))) {
      if ($entry === $_GET['path']) {
        echo json_encode(TRUE);
        return;
      }
    }
    echo json_encode(FALSE);
    

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      相关资源
      最近更新 更多