【问题标题】:Is my way of handling Image Uploads secure?我处理图片上传的方式安全吗?
【发布时间】:2019-12-29 21:12:24
【问题描述】:

我处理图片上传的方式安全吗?是否有人可以上传 .php 文件或其他可以以某种方式执行 php 代码的文件(即使攻击者知道上传后的实际文件路径?)

function random($longueur = 10)
  {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($longueur/strlen($x)) )),1,$longueur);
  } 

  $random = random(5);

  //POST DATA
  $img_name = htmlspecialchars($_POST["img_name"]);

  //IMAGE
  mkdir('../../assets/images/'.$random.'/');
  $target_dir = '../../assets/images/'.$random.'/';
  $target_file = $target_dir . basename($_FILES["img_src"]["name"]);
  $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

  //ARRAY EXTENSION GOOD
  $extension_autorisee = array('.png', '.jpg', '.jpeg', 'png', 'jpg', 'jpeg');

  if (in_array($imageFileType, $extension_autorisee)){

  //MOVE IMAGE
  move_uploaded_file($_FILES["img_src"]["tmp_name"], $target_file);
  $filename = $random."/".$_FILES['img_src']['name'];

  }

【问题讨论】:

  • 现在,我更喜欢将这类文件单独存储到应用程序文件中,例如在 Amazon S3 等云托管解决方案或 MySQL 数据库本身中。对于您的情况,确保 PHP 不能在上传文件夹中执行,我也会避免使用用户提供的文件名作为磁盘上的名称,也就是在写入文件系统时不要使用 $_FILES['img_src']['name'] 或至少把它通过验证/过滤。

标签: php security file-upload image-uploading


【解决方案1】:

它看起来相当安全,唯一的一点是它不检查 MIME 类型。我真的不知道您存储这些文件的目的是什么,大多数现代浏览器在收到嵌入了 HTML 的图像时只会抛出错误,但仍然需要研究。

另外,我不是密码学专家,但您可能想研究该字符串的“随机性”。这可能是一个很好的资源。 Cryptographically Secure Random String Function 除此之外,它看起来还不错。

闪电编辑:我觉得这类问题更适合https://codereview.stackexchange.com/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多