阻止以图片上传形式上传大型和不受支持的文件

时间:2014-04-18 06:51:24

标签: php image upload

我有一个带有图片上传选项的php表单,如下所示

 <input type="hidden" name="old_picture" value="<?php if (!empty($old_picture)) echo        $old_picture; ?>" />
  <label for="new_picture">Picture:</label>
  <input type="file" id="new_picture" name="new_picture" />

和php脚本类似

if (!empty($new_picture)) {
  if ((($new_picture_type == 'image/gif') || ($new_picture_type == 'image/jpeg') || ($new_picture_type == 'image/pjpeg') ||
    ($new_picture_type == 'image/png')) && ($new_picture_size > 0) && ($new_picture_size <= MM_MAXFILESIZE) &&
    ($new_picture_width <= MM_MAXIMGWIDTH) && ($new_picture_height <= MM_MAXIMGHEIGHT)) {
    if ($_FILES['file']['error'] == 0) {
      // Move the file to the target upload folder
      $target = MM_UPLOADPATH . basename($new_picture);
      if (move_uploaded_file($_FILES['new_picture']['tmp_name'], $target)) {
        // The new picture file move was successful, now make sure any old picture is deleted
        if (!empty($old_picture) && ($old_picture != $new_picture)) {
          @unlink(MM_UPLOADPATH . $old_picture);
        }
      }
      else {
        // The new picture file move failed, so delete the temporary file and set the error flag
        @unlink($_FILES['new_picture']['tmp_name']);
        $error = true;
        echo '<p class="error">Sorry, there was a problem uploading your picture.</p>';
      }
    }
  }
  else {
    // The new picture file is not valid, so delete the temporary file and set the error flag
    @unlink($_FILES['new_picture']['tmp_name']);
    $error = true;
    echo '<p class="error">Your picture must be a GIF, JPEG, or PNG image file no greater than ' . (MM_MAXFILESIZE / 1024) .
      ' KB and ' . MM_MAXIMGWIDTH . 'x' . MM_MAXIMGHEIGHT . ' pixels in size.</p>';
  }
}

每件事情都运行正常,但是当我试图上传一个.zip文件时,问题就出现了,但是没有加载图像,但它刷新了我的数据库。该用户的所有条目都已删除。

现在我想要一些关于如何防止这种情况的建议

提前致谢

1 个答案:

答案 0 :(得分:0)

在客户端,你可以做的事情并不多,你可以真正依赖。但它可以帮助防止意外问题。

将此属性添加到文件上传控件以限制文件类型:accept="image/gif, image/jpeg"

如果您想确定自己获得的内容,则需要在服务器端进行验证。

检查$_FILES['uploadctl']['size']是否有文件大小,看它是否超出了您的限制。

您可以通过在php.ini中设置upload_max_filesize来强制php限制它接受的文件上传大小。默认值非常低。

您真的不相信上传文件的扩展名实际上是正确的。仅仅因为它说.jpg并不意味着它真的存在。如果您接受的只是图像,则应该能够使用getimagesize()验证mimetype。如果您接受更大范围的文件,请使用Fileinfo检查文件。

如果删除了数据库中的条目,则代码中可能存在逻辑问题,而您在此处未显示。