如何保护此PHP上载脚本

时间:2013-04-26 21:40:31

标签: php security upload

我已经阅读了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
?>

3 个答案:

答案 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可能会遇到麻烦,因为编码可以绕过其中一些。

  1. file_get_contents()
  2. 读取临时文件
  3. 在其上运行strip_tags()
  4. 使用GD库创建新图像
  5. read()投放图片 - 不要使用include()require()
  6. 在该目录上禁用php引擎

答案 2 :(得分:0)

为了简洁起见,我没有进行任何错误检查..但你可以评估这样一个文件的扩展名:

$filename = $_FILES['image_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if($ext !== 'jpg' && $ext !== 'png' && $ext !== 'gif') {echo 'error';}