PHP上传文件过滤

PHP上传文件过滤,php,html,upload,Php,Html,Upload,我试图写一个上传脚本,只接受PNG图像上传。上传脚本工作正常,但当我添加png图像检测时,它会中断 以下是我如何设置它的: if ($_FILES) { if ($_FILES["file"]["type"] == "image/png") { $target_path = "uploads/"; $target_path = $target_path . basename( $_FILES['uploadedfile']['name']);

我试图写一个上传脚本,只接受PNG图像上传。上传脚本工作正常,但当我添加png图像检测时,它会中断

以下是我如何设置它的:

if ($_FILES) {

        if ($_FILES["file"]["type"] == "image/png") {

        $target_path = "uploads/";
        $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
            echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
            " has been uploaded";
        } else{
            echo "There was an error uploading the file, please try again!";
        }

        } else { echo "Not A PNG…";

        }

    }

上载PNG图像时,出现“not a PNG”错误-有什么想法吗?

看起来您在IF语句中引用了错误的文件:

if ($_FILES["file"]["type"] == "image/png") {
应该是

if ($_FILES["uploadedfile"]["type"] == "image/png") {

(“file”需要是“uploadedfile”)

我看到一些服务器没有在$\u FILES变量中添加mime类型的image/png。。。有一种稍微重一点的方法:

if (@imagecreatefrompng($_FILES["file"]["tmp_name"])
当您使用GD库打开图像画布时,这里的性能会稍微降低

如果性能或缺少GD库是一个问题,只需检查扩展:

if (strtolower(end(explode('.',$_FILES["file"]["name"])) == 'png')

注意 如果要使用该函数,建议确保安装了GD:
If(函数_存在('imagecreatefrompng'))


重要 如果你对内存使用持谨慎态度(你应该这样做)

  • 切勿将
    $\u文件[…]['type']
    用于任何用途。它只是一个用户提供的任意字符串,可能与实际文件有关,也可能与实际文件无关
  • 因此,请自己检查MIME类型
  • 启用
    错误报告(E\u ALL);ini设置(“显示错误”,真),这将帮助您找到特定的打字错误
  • 尽早习惯失败
  • 2和4的示例:

    if (!empty($_FILES['uploadedfile'])) {
        if ($_FILES['uploadedfile']['error'] !== UPLOAD_ERR_OK) {
            die('Error during upload');
        }
        if (exif_imagetype($_FILES['uploadedfile']['tmp_name']) !== IMAGETYPE_PNG) {
            die('Wrong file type');
        }
        ...
    }
    

    你确定它是PNG图像,而不是扩展名为.PNG的其他格式吗?我意识到问题是由于名称输入错误导致该格式无法正常运行,但是值得解决,因为其他人提到,这里提供的类型字符串不可信。这是绝对正确的,而且由于您实际上没有检查有关文件的任何其他信息,因此可以轻松绕过此检查,以允许将任意代码(或任何其他内容)上载到您的系统。我建议采取其他措施来保护此上载脚本,否则在不久的将来可能会出现安全问题。谢谢,我完全没有注意到这一点-我会在计时器启动后检查它。此脚本不保证图像实际上是png图像。Mimetype很容易伪造。不过,这就是问题所在?哈哈-顺便说一句,如果你想使用PHP-GD进行正确的PNG验证,请参阅我下面的帖子,nice eyes@Ben DYeah,对不起,我刚刚混淆了变量名。
    if (!empty($_FILES['uploadedfile'])) {
        if ($_FILES['uploadedfile']['error'] !== UPLOAD_ERR_OK) {
            die('Error during upload');
        }
        if (exif_imagetype($_FILES['uploadedfile']['tmp_name']) !== IMAGETYPE_PNG) {
            die('Wrong file type');
        }
        ...
    }