0

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

3 回答 3

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 文件。

于 2013-04-27T12:01:10.727 回答
1

如果您想在上传到达您的服务器之前停止上传,您可以使用 javascript 对其进行过滤。有关更多信息,请参阅此 SO 答案:stackoverflow.com/questions/71944/... – Kevin 4 月 26 日 22:13

永远永远永远永远永远永远不会信任客户端验证...


编写安全上传代码很困难。很难。

您不能信任文件扩展名或 mime 类型,因为客户端可以更改它。

如果您只想上传 gif、jpeg 或 png,您可以采取这些步骤。使用 png 您可能会遇到麻烦,因为编码可以绕过其中一些。

  1. 读取临时文件file_get_contents()
  2. 运行strip_tags()它。
  3. 使用 GD 库创建新图像
  4. 通过以下方式提供图像read()-不要使用include()require()
  5. 在该目录上禁用 php 引擎
于 2013-05-04T18:44:51.287 回答
0

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

$filename = $_FILES['image_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if($ext !== 'jpg' && $ext !== 'png' && $ext !== 'gif') {echo 'error';}
于 2013-04-26T21:46:19.623 回答