为什么我的图像上传显示在我的imagelocation字段在phpMyAdmin


Why isn't my image upload showing up in my imagelocation field in phpMyAdmin?

我已经玩了很长时间了,似乎不能弄清楚为什么会发生这种情况-我正在跟随"PhpAcademy"教程&有以下代码(我只是使用phpmyadmin上传基于会话的用户配置文件pic):问题是,当我选择文件&点击"上传",图像文件没有显示在phpmyadmin下的"imagelocation"。任何帮助都将非常感激。谢谢!

启动上传过程的'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>
";  
?>

允许用户上传&然后也显示配置文件PIC:

<?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'>";
}

?>

您的代码将允许恶意用户上传任何他们想要的文件,在您的服务器上的任何地方。你盲目地相信['name']参数是"安全的"。您的代码中没有任何错误处理,并假设一切都会很好。

换句话说,你刚刚在你的服务器上打开了一个巨大的安全漏洞,任何有一点点兴趣的人都可以驾驶海盗船通过。

在绝对裸的最低限度,你需要这样检查上传是否成功:

if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    ... file was uploaded ok
} else {
    die("Upload failed with error code " . $_FILES['file']['error']);
}

永远不要相信用户提供的任何东西。在文件上传时,即a)文件名(['name']), b)文件的mime类型(['type'])。两者操作起来都很简单。

一旦你验证了上传成功,你需要检查他们确实上传了一个图像,而不是"maliciousscript-that- gave -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");
}

然后,对于在服务器上存储此上传文件的文件名,永远不要使用用户提供的名称。自己做一个。由于要在"members"表中存储有关该图像的详细信息,因此请使用该用户的成员ID(该表上确实有一个主键,对吧?)因此,将/site/images/userprovidedfilename.jpg改为/site/images/37(假设用户的id为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());
}

这绝对是你应该做的最基本的方式来保护你的上传脚本。还有很多事情可以做,但这应该让你远离所有的攻击者,除了最坚定的攻击者。而且,即使您没有受到攻击,错误处理也会帮助您捕捉到由于正当原因而发生错误的时刻。