2012-12-26 24 views
-1
<html> 
<body> 

<form action="upload-file.php" method="post" 
enctype="multipart/form-data"> 
<label for="file">Filename:</label> 
<input type="file" name="file" id="file"><br> 
<input type="submit" name="submit" value="Submit"> 
</form> 

</body> 
</html> 

这里是php代码文件上传..我想用这个php代码,我从w3schools得到..你认为这是一个安全的文件上传代码?这是我找到的最简单的代码,它工作得非常好..我尝试了一些其他来源的代码,但我无法让它们工作....任何想法?w3schools的文件上传代码是否安全?

<?php 
ini_set('display_errors', '0'); 
error_reporting(E_ALL | E_STRICT); 
$allowedExts = array("jpg", "jpeg", "gif", "png"); 
$extension = end(explode(".", $_FILES['file']['name'])); 
if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/png") 
|| ($_FILES["file"]["type"] == "image/pjpeg")) 
&& ($_FILES["file"]["size"] < 2097152) 
&& in_array($extension, $allowedExts)) 
{ 
if ($_FILES["file"]["error"] > 0) 
{ 
echo "Return Code: " . $_FILES["file"]["error"] . "<br>"; 
} 
else 
{ 
echo "Upload: " . $_FILES["file"]["name"] . "<br>"; 
echo "Type: " . $_FILES["file"]["type"] . "<br>"; 
echo "Size: " . ($_FILES["file"]["size"]/1024) . " kB<br>"; 
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>"; 

if (file_exists("images/" . $_FILES["file"]["name"])) 
{ 
echo $_FILES["file"]["name"] . " already exists. "; 
} 
if($_FILES['file']['size'] > 2097152) //2mb 

echo 'File over 2MB'; 

else 
{ 
move_uploaded_file($_FILES["file"]["tmp_name"], 
"images/" . $_FILES["file"]["name"]); 
echo "Stored in: " . "images/" . $_FILES["file"]["name"]; 
} 
} 
} 
else 
{ 
echo "Invalid file"; 
} 
?> 
+0

您对剧本的要求是什么?它应该做什么(因此应该停止什么)?如果没有确切的要求,很难判断代码允许的内容应该或不应该被允许。 – complex857

+0

'任何想法' - 是的,学习你自己关于在php中上传文件,编写自己的代码,了解安全性,修复代码中的错误等等,而不是完全理解它的作用而不是第三方代码。 –

+0

您应该验证图像实际上是否有效。检查文件名是不够的。 – Blender

回答

6

这总比没有好,但我不会说这是安全。也许比没有更安全

有许多恶意软件会感染图像,虽然代码会阻止您上传除映像扩展名以外的文件,但它不会除去恶意软件或检查实际上传的字节。

从理论上讲,一个可执行文件可以从MyApp.exe将被重新命名为myapp.jpg把一个坏的文件服务器上,并附加攻击可以做它重命名回并感染或者您的服务器,或者一些粗心的客户端。

推荐阅读:https://www.owasp.org/index.php/Unrestricted_File_Upload

这种类型的保护下瀑布“使用白名单文件扩展”,这被认为是‘弱’这个特殊的OWASP页面上。


而且,MrCode在上面的评论说,你可以尝试读取与GD library的文件,并检查图像尺寸。如果它回到0或无法读取图像,那么它不是图像文件。这是我链接到的文章中未提及的另一个安全层。这也是我在.NET中使用System.Drawing命名空间在实践中做的事情。感谢MrCode,因为我不是PHP开发人员,并且不知道如何在PHP中执行此操作。再次感谢!

+0

感谢您的帮助..你知道任何网站已经准备好使用像w3schools的代码吗? – Magna

+1

不是我所信任的。我知道这完全没有帮助,但如果你要上传文件,在我看来,你必须学会​​安全地做。这意味着没有捷径和研究。否则,你会让访问者处于危险之中。 – David

+0

然而,本着有益的精神,这是一个开始学习的好地方(OWASP网站除外,它是安全网站开发的资源)。http://blog.creatdesigns.com/2009/01/secure -file-upload-in-php-web-applications/ – David