上传用户提供的图像并安全存储


Uploading a user-provided image and storing it safely

在我的应用程序的不同部分,我允许用户上传一个图像文件(将存储在AWS S3中),稍后在网站上显示。通常是个人资料图片和徽标。

我担心的是:

  • 安全。它真的是一个图像文件吗?用户是否试图上载恶意文件
  • 质量
  • 文件类型。有些图像更适合JPEG,有些则更适合PNG。上传者可能最清楚,因为这是他的文件
  • 文件扩展名。我认为当扩展名与文件类型匹配时,浏览器会喜欢它。将PNG隐藏在".jpg"中可能是个坏主意

按照我目前的做法,我认为所有的图像都应该是JPEG。然后在PHP中,我将执行类似imagejpeg(imagecreatefromstring(file_get_contents($from)), $tmp)的操作,强制它为JPEG文件。然后,我将生成的文件作为image/jpeg上传到S3。名称是自动生成的,并且总是以".jpg"结尾。

我相信这会考虑到文件被重新生成为JPEG时的"安全性"(但也许我错了?)。但它绝对不能处理用户想要上传PNG文件的情况。

小贴士?

(使用PHP、Yii、AWS)

我建议根据我找到的链接查看上传文件的"幻数"http://x10hosting.com/forums/tutorials/106510-securing-your-php-file-upload-scripts.html这要安全得多,因为你不依赖文件扩展名,你需要删除一个你想允许的文件的白名单,然后只启动剩余的文件。

将上传的图像转换为正确的格式比将其隐藏在另一个文件扩展名中更有意义,屏蔽原始扩展名可能在大多数浏览器上都有效,但你一定会遇到问题。我建议使用任何一个imagemagik。

最后,您可能需要查看PHPmove_uploaded_file函数,以确保上载的文件是有效的http://php.net/manual/en/function.move-uploaded-file.php

希望这能有所帮助!