我已经玩弄了很多年,似乎无法弄清楚为什么会发生这种情况 - 我正在关注“PhpAcademy”教程&有以下代码(我只是使用phpmyadmin根据会话上传用户个人资料图片):问题是当我选择文件&单击“上传”图像文件未显示在“imagelocation”下的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>
";
?>
应该允许用户上传的'个人资料'页面&amp;然后还显示简介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'>";
}
&GT;
答案 0 :(得分:1)
您的代码将允许恶意用户在您的服务器上的任何位置上传他们想要的任何文件。你一味地相信['name']
参数是'安全的'。您的代码中没有任何错误处理,并假设一切都会好起来。
换句话说,你刚刚在你的服务器上打开了一个巨大的安全漏洞,任何有一点点兴趣的人都可以驾驶海盗船。
在绝对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']
)。两者都很容易操纵。
一旦你确认uplaod成功了,你需要检查他们确实上传了一张图片,而不是“maliciousscript-that-give-them-total-control.php”或“nasty_virus.exe”:< / p>
$info = getimagesize($_FILEs['file']['tmp_name']);
if ($info === FALSE) {
die("You didn't upload a valid image type");
}
然后,对于在您的服务器上存储此上传文件的文件名,永远不要使用用户提供的名称。自己生成一个。由于您要在“成员”表中存储有关此图像的详细信息,请使用该用户的成员ID(您在该表上确实有一个主键,对吗?)。因此,不要使用/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());
}
这是保护上传脚本的绝对最低限度。还有很多事情可以做,但除了最坚定的攻击者之外,这应该能让你保持安全。即使你没有受到攻击,错误处理也有助于捕捉事情因合法原因而爆炸的时间。