如何使用$ _GET路径与file_exists,并保持它的安全?(How to use $_GET

2019-09-23 05:15发布

我有一个函数来检查,如果通过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和/包我的服务器或文件的内容,以试图限制到该目录调用的人,但我认为,人们可以简单地使用../提供的路径中检查的替代品。

是什么使这个安全,最好把它限制在/包,以及是否有任何其他问题,我应该担心的最佳方式?

编辑:在JavaScript / jQuery的一个例子电话:

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

Answer 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
}


Answer 2:

您可以删除从文件名的路径横贯:

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

这种做法是适度安全,快速(O(1)复杂性),但是你一定要注意编码,字符替换和所有喜欢的东西是不是真的是最好的。

但整体的最佳实践(尽管不那么快取决于你的目录大小,假设O(n)的复杂性)是使用READDIR(),以获得在你的/礼包目录,然后看看所提供的文件名是所有文件的列表当下:

$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);


文章来源: How to use $_GET path with file_exists and keep it safe?