2014-11-08 3 views
-4

Как я могу защитить этот код ???Как я могу защитить php-код?

Проблема в том, что вы можете использовать ../ для перемещения каталогов. Как заблокировать каталог?

<?php 
    $target_path = "user/"; 
    $username = basename($_POST['user']); 
    $file = basename($_FILES['file']['name']); 
    $target_path = $target_path . $username 
    $target_path = $target_path . "/" 
    $target_path = $target_path . $file 
    if(move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) { 
    echo "The file ". basename($_FILES['file']['name']). " has been uploaded"; 
?> 
<br /> 
<?php 
    echo "The file can be opened or downloaded at asasse.no-ip.org/user/" . $_POST['user'] . "/" . basename($_FILES['file']['name']); 
    } else{ 
    echo "There was an error uploading the file, please try again!"; 
    } 
?> 
+0

помещает загруженные изображения на другой компьютер в неисполняемой файловой системе. О, и не просто проверяйте расширение файлов. Вы должны декодировать двоичный файл и проверять магическое значение или что-то еще, если вы загружаете изображения. –

+0

Вы не должны использовать нефильтрованный ввод пользователя (например, $ _POST). Перед тем, как использовать его, разделите нарушающие символы от имени пользователя. –

+0

Цель этого скрипта - разрешить пользователю загружать любой файл, который им нравится. –

ответ

0

Как я уже упоминал в своем комментарии, используйте

$file = "../libs/somebadfile.php" 
$file = basename($file); 
//outputs "somebadfile.php" 

или

$path_parts= pathinfo($file); 

echo $path_parts['dirname'], "\n"; 
echo $path_parts['basename'], "\n"; 
echo $path_parts['extension'], "\n"; 
echo $path_parts['filename'], "\n"; 

//outputs 
//========= 
// "../libs" - not sure about this can't test it right now ;-p 
// "somebadfile.php" ~ equivalent to basename() above. 
// "php" 
// "somebadfile" 

Затем поставить базовый путь, только позволяя пользователю поставить имя файла часть.

"path/to/folder" . $file; 

И больше не обход каталога. Это также называется атакой «точка-точка-косая черта». Из википедии

http://en.wikipedia.org/wiki/Directory_traversal_attack

Это лучше, более «безопасные» сейчас, но он может быть очищен немного больше:

$basepath = "user/"; 
$username = basename($_POST['user']) . "/"; 
$filename = basename($_FILES['file']['name']); 
$filepath = $basepath . $username . $filename; 
if(move_uploaded_file($_FILES['file']['tmp_name'], $filepath)) { 
    echo "The file can be opened or downloaded at asasse.no-ip.org/$filepath"; 
}else{ 
    echo "There was an error uploading file \"$filename\", please try again!"; 
} 

Если вы хотите разрешить только файлы определенного набора расширения, такие как изображения.

$basepath = "user/"; 
$username = basename($_POST['user']) . "/"; 
$allowed = array('jpg', 'png', 'gif', 'bmp'); 
if(!preg_match("/\.(".implode("|", $allowed).")$/i", $filename, $extension)){ 
    echo 'Extension "'.$extension[1].'" not allowed, must be one of the following "'.implode('", "', $allowed).'" file types.'; 
}else{ 
    $filename = basename($_FILES['file']['name']); 
    $filepath = $basepath . $username . $filename; 
    if(move_uploaded_file($_FILES['file']['tmp_name'], $filepath)) { 
     echo "The file can be opened or downloaded at asasse.no-ip.org/".$filepath; 
    }else{ 
     echo "There was an error uploading file \"$filename\", please try again!"; 
    } 
} 

P.S Я не тестировал это, но он должен быть довольно близко.

+0

Так будет ли это лучше подходит –

+0

LoL - голосуете за правильную функцию? - @AnthonySasse - попробуй и посмотри. – ArtisticPhoenix