php 图片上传安全探讨

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010136741/article/details/50445588

PHP 图片上传安全探讨


转载请标明出处: 
http://blog.csdn.net/u010136741/article/details/50445588
本文出自:柳木木_kylin的博客】


[问题发现]

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

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

逻辑上是对的,

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

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

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

[实验阶段]

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

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


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


图片也上传成功了服务器


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


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



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


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


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


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


[应对思路方法]

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

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

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


猜你喜欢

转载自blog.csdn.net/u010136741/article/details/50445588