Ваш код позволит злоумышленнику загружать любой файл в любое место на вашем сервере. Вы слепо полагаете, что параметр ['name']
является «безопасным». В вашем коде нет обработки ошибок, и вы предполагаете, что все будет хорошо.
Другими словами, вы только что открыли зияющую дыру в безопасности на своем сервере, через которую любой, кто имеет хоть малейший интерес, сможет прогнать пиратский корабль.
При абсолютном минимуме BARE необходимо проверить успешность загрузки следующим образом:
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
... file was uploaded ok
} else {
die("Upload failed with error code " . $_FILES['file']['error']);
}
Никогда не доверяйте ничему, что предоставляет пользователь. При загрузке файлов это: а) имя файла (['name']
), б) тип mime файла (['type']
). Оба тривиальны для манипулирования.
После того, как вы убедились, что загрузка успешно завершена, вам нужно проверить, что они действительно загрузили изображение, а не "maliciousscript-that-give-them-total-control.php" или "nasty_virus.exe":
$info = getimagesize($_FILEs['file']['tmp_name']);
if ($info === FALSE) {
die("You didn't upload a valid image type");
}
Затем, чтобы имя файла для сохранения этого загружаемого файла на вашем сервере, НИКОГДА не используйте предоставленное пользователем имя. Создай один сам. Поскольку вы храните сведения об этом изображении в таблице «члены», используйте идентификатор участника этого пользователя (у вас есть первичный ключ в этой таблице, верно?). Поэтому вместо /site/images/userprovidedfilename.jpg
сделайте его /site/images/37
(при условии, что у пользователя есть идентификатор 37).
Убедитесь, что перемещение файла действительно завершилось успешно:
$status = move_uploaded_file($_FILEs['file']['tmp_name'], '/some/path/that/you/generated');
if ($status === FALSE) {
die("Unable to move uploaded file to destination");
}
Затем вы обновляете базу данных, проверяя, действительно ли запрос выполнен успешно:
$sql = "...";
$result = mysql_query($sql);
if ($result === FALSE) {
die(mysql_error());
}
Это абсолютный минимум того, что вы должны делать для защиты скрипта загрузки. Есть еще много вещей, которые можно сделать, но это должно защитить вас от всех, кроме самых решительных атакующих. И даже если на вас не нападают, обработка ошибок поможет поймать время, когда все действительно взорвалось по законным причинам.