$_FILES['NAME']['SIZE']、$_FILES['NAME']['TYPE']
前几天忙于工作就没有搞这玩意儿,不过今天我又回来了,Let's keep on going~
还记得先前制作的发布积分图片的上传页面吧?这个页面非常的危险,很有可能被别有用心的人利用,从而干一些别有用心的事,例如窃取服务器的数据什么的。
为什么危险?因为这个文件上传的地方没有做任何的验证,虽然我们主观设想是用户们都会上传图片,但是其实他可以上传任何大小任何类型的文件,这就出现问题了!
在修改代码之前,我们来做一个小小的试验,来验证我的说法是否正确:
1、首先我们可以很容易的分析出上传的文件放在哪个路径中的
2、由于没有验证,我们可以上传一个小小的“别有用心的脚本”
3、看!脚本成功的运行了!
当然,我们这里做小测试上传的php脚本只是调用phpinfo()函数(实际建站一般会关闭这个函数)。如果是真正的破坏者他们也许会编写一些恶意的脚本来试图控制服务器,所以我们必须做一些措施,来加强安全性。
那,怎么做呢?只需要添加上传验证就可以了,而且非常简单!
我们需要用到两个新的全局变量:$_FILES['NAME']['SIZE']和$_FILES['NAME']['TYPE']。看名字就知道功能了,一个反应文件大小,一个反应文件类型。OKAY,我们结合之前学习的知识来写一个验证。
首先我们要保证上传的文件类型是图片:
//首先把上传的文件类型传递到$screenshot_type变量 $screenshot_type = $_FILES['NAME']['SIZE'] ; ... //判断$screenshot_type变量(即上传的文件类型)是否为合法的图片类型 if( ($screenshot_type == 'image/gif') || ($screenshot_type == 'image/png') || ($screenshot_type == 'image/jpeg') || ($screenshot_type == 'image/pjpeg')|| ($screenshot_type == 'image/bmp') ) ...
其次我们要保证上传的图片不是那么的大:
//定义图片大小常量,单位B define('GW_MAXFILESIZE', 32768 ); //首先把上传的文件大小传递到$screenshot_size变量 $screenshot_size = $_FILES['NAME']['SIZE'] ; ... //判断$screenshot_size变量(即上传的文件大小)是否合法,大于 0 小于 设定的MAX if( ($screenshot_size > 0) && ($screenshot_size <= GW_MAXFILESIZE) ) ...
把两者合并起来
...
if ( ( ($screenshot_type == 'image/gif') || ($screenshot_type == 'image/png') || ($screenshot_type == 'image/jpeg') || ($screenshot_type == 'image/pjpeg')|| ($screenshot_type == 'image/bmp') ) && ($screenshot_size > 0) && ($screenshot_size <= GW_MAXFILESIZE) ) //注意此处在合并的过程中注意括号来改变优先级,PHP的逻辑运算有短路的作用
...
再加上一个else语句给个错误的回显
... else { //当不是图片的时候,打印出文件类型错误的消息 if(!( //这里有个"!" ($screenshot_type == 'image/gif') || ($screenshot_type == 'image/png') || ($screenshot_type == 'image/jpeg') || ($screenshot_type == 'image/pjpeg')|| ($screenshot_type == 'image/bmp') ) ) { echo "Uploaded File Type Error!<br />"; } //当图片大小小于等于零或大于最大限制的时候,打印错误信息 if( (($screenshot_size <= 0) || ($screenshot_size > GW_MAXFILESIZE)) ) { echo "the Max File Size Limited in ". GW_MAXFILESIZE/1024 . " KB <br />" ; } } ...
修改代码以后,我们再来做一次测试:
可以看到,我们的Mr.Hack先生上传的“恶意脚本”被得到了有效的阻止。
而Mr.Cracker先生的“恶性超大图片”也被拒之门外。
So, $_FILES['NAME']['SIZE']、$_FILES['NAME']['TYPE']这两个变量会用了吗?多多练习哦~