Почему загрузка изображений не отображается в моем поле изображения в phpMyAdmin? - PullRequest
0 голосов
/ 06 октября 2011

Я играю с этим целую вечность и не могу понять, почему это происходит - я следую учебнику "PhpAcademy" и у меня есть следующий код (я просто использую phpmyadmin для загрузки профиля пользователя) рис. на основе сеанса): проблема в том, что когда я выбираю файл и нажимаю кнопку «загрузить», файл изображения не отображается в phpmyadmin в разделе «расположение изображения». Любая помощь будет принята с благодарностью. Спасибо!

ФАЙЛ 'UPLOADPROFILEPIC.PHP', КОТОРЫЙ ДОЛЖЕН НАЧАТЬ ПРОЦЕСС ЗАГРУЗКИ:

<?php

$_SESSION['username']="atestuser508";

$username = $_SESSION['username'];

echo "Welcome, ".$username."!<br/>";

if ($_POST['submit']) {
// get file attributes
$name = $_FILES['myfile']['name'];
$tmp_name = $_FILES['myfile']['tmp_name'];

if ($name)
{
    // start the upload process

    $location = "avatars/$name";
    move_uploaded_file($tmp_name,$location);

    $query = mysql_query("UPDATE members SET imagelocation='$location' WHERE username='$username'");

    die("You've successfully uploaded your profile pic! <a href='login-home.php'>Return to your profile</a>");
}
else
die("Please select a file to upload!");
}

echo "Upload a profile picture:

<form action='uploadprofilepic.php' method='POST' enctype='multipart/form-data'>
File: <input type='file' name='myfile'><input type='submit' name='submit' value='Upload!'>
</form>

";  
?>

СТРАНИЦА «ПРОФИЛЬ», КОТОРАЯ ДОЛЖНА ПОЛЬЗОВАТЬСЯ ЗАГРУЗКОЙ, И ТАКЖЕ ОТОБРАЖАТЬ ПРОФИЛЬ ПИК:

<?php include("uploadprofilepic.php"); ?>
<?php
$query = mysql_query("SELECT * FROM members WHERE username='$username'");
if (mysql_num_rows($query)==0) 
die("User not found!");
else {
$row = mysql_fetch_assoc($query);
$location = $row['imagelocation'];

echo "<img src='$location'>";
}

?>

1 Ответ

1 голос
/ 06 октября 2011

Ваш код позволит злоумышленнику загружать любой файл в любое место на вашем сервере. Вы слепо полагаете, что параметр ['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());
}

Это абсолютный минимум того, что вы должны делать для защиты скрипта загрузки. Есть еще много вещей, которые можно сделать, но это должно защитить вас от всех, кроме самых решительных атакующих. И даже если на вас не нападают, обработка ошибок поможет поймать время, когда все действительно взорвалось по законным причинам.

...