我已经阅读了Secure PHP Upload Scripts线程,但是我很难让这个已知的好脚本接受更改。我希望这个脚本只允许.jpeg,.png和.gif文件。有人可以告诉我如何修改这个脚本吗?
<?php
$result=0;
if (trim($_POST["action"]) == "Upload File") { //**** User Clicked the Upload File Button
//*********** Execute the Following Code to Upload File *************
$imagename = basename($_FILES['image_file']['name']); // grab name of file
$result = @move_uploaded_file($_FILES['image_file']['tmp_name'], $imagename); // upload it
if ($result==1) echo("Successfully uploaded: <b>".$imagename."</b>"); // did it work?
} // end if
?>
<?php
if ($result==1) echo("<img src='".$imagename."'>"); // display the uploaded file
?>
答案 0 :(得分:1)
$filename = $_FILES['image_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if($ext !== 'jpg' && $ext !== 'png' && $ext !== 'gif') {echo 'error';}
是验证的一个非常糟糕的主意。
echo '<pre>';
$filename = 'image.php\0.jpg';
$extension = pathinfo($filename, PATHINFO_EXTENSION);
var_dump($ext);
var_dump显示jpg
php函数move_uploaded_file易受空字节\ 0的攻击。 在move_uploaded_file之后,服务器将创建一个image.php文件..
答案 1 :(得分:1)
如果要在上传到服务器之前停止上传,可以使用javascript对其进行过滤。有关更多信息,请参阅此SO答案:stackoverflow.com/questions/71944 / ... - Kevin Apr 26 at 22:13
绝不会永远不会永远不会信任客户端验证...
编写安全上传很难。很难。
您无法信任文件扩展名或mime类型,因为客户端可以更改此内容。
如果你只想上传gif,jpeg或png,你可以采取这些步骤。使用png可能会遇到麻烦,因为编码可以绕过其中一些。
file_get_contents()
。strip_tags()
。read()
投放图片 - 不要使用include()
或require()
答案 2 :(得分:0)
为了简洁起见,我没有进行任何错误检查..但你可以评估这样一个文件的扩展名:
$filename = $_FILES['image_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if($ext !== 'jpg' && $ext !== 'png' && $ext !== 'gif') {echo 'error';}