Как я уже упоминал в своем комментарии, используйте
$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 Я не тестировал это, но он должен быть довольно близко.
помещает загруженные изображения на другой компьютер в неисполняемой файловой системе. О, и не просто проверяйте расширение файлов. Вы должны декодировать двоичный файл и проверять магическое значение или что-то еще, если вы загружаете изображения. –
Вы не должны использовать нефильтрованный ввод пользователя (например, $ _POST). Перед тем, как использовать его, разделите нарушающие символы от имени пользователя. –
Цель этого скрипта - разрешить пользователю загружать любой файл, который им нравится. –