3

インデックスページのボタンをクリックして特定の画像を変更するときに使用するPHPスクリプトを呼び出すjQueryを介してファイルが存在するかどうかを確認する関数があります。

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');
}
4

2 に答える 2

3

これは私が過去にそれを処理した方法です:

$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
}
于 2012-09-29T19:16:29.090 に答える
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);
于 2012-09-29T19:19:46.053 に答える