安全图像(JPG,PNG,动画GIF)上传

时间:2012-11-30 22:31:20

标签: php image upload gif watermark

我正在寻找最佳解决方案(=>安全,快速,独立)的方式来解决图像上传(我也希望从URL下载)静态jpg / png和动画gif文件(如果文件是一个gif,但不是动画,让它成为一个png)。

奖励信息:我正在Amazon EC2服务器上执行PHP上传脚本,并将图像上传到Amazon S3存储桶。如果这改变了什么,请告诉。

奖金信息2:解决此问题后,我想在图像下方添加类似DAMNLOL的水印(例如:http://www.damnlol.com/i/916d72c17e572b14a14c283b2f96f997.jpg)。

到目前为止我如何解决问题:

  1. 用户选择要以表格/从URL上传的文件,继续使用PHP脚本(在用户中止时不会中止)。

  2. 脚本拍摄图像,进行一些检查:最大文件大小,$_FILES['file']['type']必须是“image / gif”,“image / png”,“image / jpg”。最大/最小宽度&高度检查。如果一切正常,请继续。

    • 如果用户从本地计算机上传图像,请将图像存储在具有临时名称的服务器上。之后,php脚本使用CURL调用http://regex.info/exif.cgi并将temp url作为输入。
    • 或者在提交的网址的情况下,php脚本使用CURL调用http://regex.info/exif.cgi并将提交的网址作为输入。
  3. Jeffrey(Jeffrey代表Jeffrey的Exif查看器(regex.info/exif.cgi))给了我一个回复。如果它意味着图像确实是PNG,JPG或GIF类型,则脚本会下载文件(如果是提交的URL)或将文件(如果是上传的图像)移动到最终图像文件夹。成功了!

  4. 正如您所看到的,当您通过URL提交文件时,该脚本很容易受到攻击,并且URL会将Jeffrey重定向到有效图像,但我的服务器会重定向到恶意代码。至少这就是我的想法。

    这个解决方案很慢,但在我看来相当安全。上传大约需要2-5秒,具体取决于文件大小。 GIF往往需要约4-10秒。其他网站不需要那么长时间,仍然是安全的。


    关于如何解决问题的想法:

    • 显然Jeffrey能够找到EVERYTIME的实际文件类型。 PHP中是否有这样的防弹方法?显然,通过文件名来决定文件类型是解决这个问题的一种非常糟糕的方法。

    • 结合信息2,我可以简单地拍摄提交的图像,得到宽度和宽度。高度信息,使用(new_image_width = submitted_image_width,new_image_height = submitted_image_height + watermark_height)创建一个新的空白图像,并将提交的图像存储在其下方的水印中。如果整个过程失败,则提交的图像不是JPG / PNG / GIF类型,并且脚本将中止。向动画GIF添加水印时可能会有点棘手,但显然可以( - > http://forgifs.com/gallery/d/206365-1/Fitness-ball-roof-jump.gif)。

    您如何看待我的想法?您对此特定问题有任何详细的解决方案吗?我已经了解了很长时间并对这个主题进行过多次研究,但我从未找到“最好的”解决方案。

    谢谢你的时间。我们终于可以解决这个问题并帮助我和成千上万的人在Google上搜索这个问题的解决方案。

1 个答案:

答案 0 :(得分:0)

我使用http://www.webmotionuk.co.uk/php-jquery-image-upload-and-crop/的修改版本 至少你可以查看代码,并获得一些关于使文件上传过程有点安全的想法。