Mam funkcję, aby sprawdzić, czy plik istnieje za pośrednictwem jQuery, który nawiązuje połączenie do skryptu PHP, którego użym, użyję podczas zmiany określonych obrazów na kliknięciu przycisku na mojej stronie indeksu.

Funkcja jQuery:

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

Fiolexists.php:

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

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

Martwiłem się o ludzi używając tego skryptu, aby wymienić zawartość mojego serwera lub plików, które mogę nie chcieć, aby wiedzieli, więc użyłem dokument_root i / paczki, aby spróbować ograniczyć połączenia do tego katalogu, ale myślę, że ludzie mogą po prostu Użyj ../ na podstawie dostarczonej ścieżki, aby sprawdzić alternatywy.

Jaki jest najlepszy sposób, aby to bezpieczne, idealnie ograniczyć go / paczki i czy są jakieś inne obawy, o które powinienem się martwić?

Edytuj: Przykładowe połączenie w javascript / jQuery:

if( fileExists('/index.php') ){
    alert('Exists');
}else{
    alert('Doesn\'t exist');
}
3
dux0r 29 wrzesień 2012, 23:13

2 odpowiedzi

Najlepsza odpowiedź

W ten sposób zajmowałem się tym w przeszłości:

$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
}
3
Lucas Green 29 wrzesień 2012, 19:16

Możesz usunąć przewijanie ścieżki z nazwy pliku:

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

Taka praktyka jest umiarkowanie bezpieczna i szybka (1) złożoność), ale nie jest naprawdę najlepsza, jak trzeba uważać za kodowanie, wymiana znaków i wszystkich takich rzeczy.

Ale ogólna najlepsza praktyka (choć mniej szybciej w zależności od rozmiaru katalogów, powiedzmy o (n) złożoności) byłoby użycie readdir (), aby uzyskać listę wszystkich plików w katalogu / opakowaniach, a następnie sprawdzić, czy dostarczona nazwa pliku jest teraźniejszość:

$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);
2
red 29 wrzesień 2012, 19:30