文件上传中的严格标准错误

Posted

技术标签:

【中文标题】文件上传中的严格标准错误【英文标题】:Strict Standard erro in file upload 【发布时间】:2012-08-03 02:11:37 【问题描述】:

我编写了一个 php 脚本来上传文件。但是当我按下提交按钮时,它会给出一条错误消息:

Strict Standards: Only variables should be passed by reference in H:\xampp\htdocs\phpTest\upload_file.php on line 4.

第 4 行是 $extension = end(explode(".", $_FILES["file"]["name"]));

上传文件.php:

<?php

$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/pjpeg"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
  
  if ($_FILES["file"]["error"] > 0)
    
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
    
  else
    

$target_Path = "images/";
$target_Path = $target_Path.basename( $_FILES['file']['name'] );
move_uploaded_file( $_FILES['file']['tmp_name'], $target_Path );


  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES["file"]["tmp_name"];
  echo $target_Path;
  
  
  else
  
  echo "Invalid file";
  
?> 

【问题讨论】:

我不知道为什么有人对这个问题投了反对票……这都是有效的,而且是一个不同的问题……解释了可能是什么……提供的代码……所以我投票赞成 接受适合您的答案..这样我们就可以知道实际的错误是什么 感谢@SandeepKumar。我已经接受了答案,但我不得不等待 5 分钟。 感谢你也因为这个问题我学到了一个新东西......我不会弄错 Strict Standards: Only variables should be passed by reference 的可能重复项 【参考方案1】:

您正在尝试对仅存在于该函数调用上下文中的数组执行end()。一旦该行代码完成,该数组将不复存在。试试这个:

$bits = explode(".", $_FILES["file"]["name"])
$extension = end($bits);

话虽如此,这是提取文件扩展名的糟糕方法,而且非常不安全。 $_FILES 数组中提供的文件名是远程客户端给出的文件名。伪造该文件名并非易事,允许用户上传“nastyvirus.exe”但发送“cutekittens.jpg”作为文件名。

永远不要相信用户端数据,尤其是文件上传。通过 fileinfo 使用服务器端 MIME 类型确定

【讨论】:

【参考方案2】:

根据手册,http://www.php.net/end

这个数组是通过引用传递的,因为它被函数修改了。这意味着您必须传递一个实变量而不是返回数组的函数,因为只有实变量可以通过引用传递。

所以你应该将爆炸结果分配到一个变量中,然后在那个变量上使用 end()

【讨论】:

【参考方案3】:

如果只是因为 end 函数而出现问题,那么您可以执行以下操作来获取文件的扩展名:

$path_parts = pathinfo($fullPath);
$extension = strtolower($path_parts["extension"]); 

【讨论】:

以上是关于文件上传中的严格标准错误的主要内容,如果未能解决你的问题,请参考以下文章

文件上传漏洞绕过手段

什么是文件上传漏洞

无法使用 Jmeter 中的上传文件上传图像 - 响应出现错误

文件上传漏洞学习总结

DVWA篇三:任意文件上传

上传文件中的 Mime 类型错误