php 安全上传图片,php 图片上传安全探讨

PHP 图片上传安全探讨

[问题发现]

今天想做一个图片上传的操作类,在网上找了些demo,发现大家对上传的文件,会先对文件类型进行校验,

校验的方式基本上就是获取 $_FILES["upfile"]["type"] 然后匹配自己限制的mime类型,

逻辑上是对的,

但是,问题在于我无意中看到一篇文章说$_FILES["upfile"]["type"] 的值来自于浏览器对文件类型的判断。

我马上想到了其中的安全隐患,

换句话说,一旦我们网页post的数据离开了刘浏览器,就可以被随意篡改,包括上传文件的类型,

[实验阶段]

现在我们做个小实验,我们自己写个web页面上传图片,后台对文件类型进行判断,并保存文件!

这个是我们创建的一个简单的图片上传表单:

0818b9ca8b590ca3270a3433284dd417.png

随便上传一张图片,通过fiddler调试,我们可以看到图片上传是的请求头

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

图片也上传成功了服务器

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

接下来,我们上传一个php文件上去,

0818b9ca8b590ca3270a3433284dd417.png

可以看到,php文件的mime为application/octet-stream,并没有通过后台审核

0818b9ca8b590ca3270a3433284dd417.png

那么我们现在通过fillder,直接修改CONTENT-TYPE的值,然后提交数据

文件竟然通过了后台的审核,发送到了服务器

0818b9ca8b590ca3270a3433284dd417.png

然后,我们尝试着访问这个php文件,竟然可以正常的访问,可以想象,如果这个文件里包含的是删除某些目录或者更加危险的行为,那将是非常危险的。

0818b9ca8b590ca3270a3433284dd417.png

更无语的是,如果我们自是简单的把文件的后缀名改成,jpeg,png,等等,浏览器都校验其为图片类型。

[应对思路方法]

既然上传的文件信息可以被随意篡改,那么,我们的思路就是,对上传到本地的临时文件做校验,这样就避免了客户端提交信息的不安全性。

就php而言,可以通过Fileinfo函数获取服务器的文件类型。经测试,不过是通过fiddler修改请求头,还是直接修改文件后缀,Fileinfo函数都能正确地校验文件类型。

希望平时通过$_FILES校验文件的朋友,可以过一些安全的防护,也希望朋友们多多浏览,谈谈你对文件上传安全的宝贵意见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值