繁体   English   中英

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

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

我一直在玩这个游戏很久了,似乎无法弄清楚它为什么会发生-我正在学习“ PhpAcademy”教程并提供以下代码(我只是使用phpmyadmin上传基于的用户个人资料图片会话):问题是当我选择文件并单击“上传”时,图像文件未显示在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>

";  
?>

允许用户上传并随后显示个人资料图片的“个人资料”页面:

<?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']参数是'safe'。 您不会在代码中处理任何错误,并假定一切都会很好。

换句话说,您刚刚在服务器中打开了一个巨大的安全漏洞,任何有丝毫兴趣的人都将能够驾驶海盗船通过。

在最低BARE最低要求下,您需要通过以下方式检查上传是否成功:

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-gives-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");
}

然后,对于要在服务器上存储该上传文件的文件名,请不要使用用户提供的名称。 自己创造一个。 由于您要将有关此图像的详细信息存储在“成员”表中,因此请使用该用户的成员ID(您在该表上确实有主键,对吗?)。 因此,将其设置为/site/images/37 (假设该用户的ID为37),而不是/site/images/userprovidedfilename.jpg

确保文件移动实际成功:

$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());
}

这是确保上传脚本安全的绝对最低要求。 还有很多事情可以做,但这应该可以确保您免受最坚定的攻击者的伤害。 即使您没有受到攻击,错误处理也将帮助您把握正当理由使其崩溃的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM