yii2文件上传中关于modle文件验证有漏洞 [ 技术分享 ]
model中关于文件上文限制,只进行了前台的js判断,开发人员请在后台也进行判断上传的文件,否则浏览器禁用js可以直接上传脚本文件等不安全文件,如果服务器在不进行权限及访问文件类型控制,可能服务器权限被夺,下为没有进行文件的上传过滤代码
$model->file = UploadedFile::getInstance($model, 'file');
$xlsaddr = 'uploads/' . $model->file->baseName . '_' . $t .".". $model->file->extension;
$model->file->saveAs($xlsaddr);
共 6 条回复
-
我解释下吧,不然可能会让其他人误会
在contorller中写上传增改数据内容都是这样写<?php public function actionName(){ $model = new Tablename(); if($model->load(Yii::$app->request->post()) && $model->validate()){ ....... //上传图片 $model->pic= UploadedFile::getInstance($model, 'pic'); $t = Yii::$app->user->identity->id."_".str_replace(".",'',uniqid('',true)).mt_rand(1000,9999); $xlsaddr = 'uploads/'. $t . '.' . $model->pic->extension; //将项目移动到$xlsaddr路径位置 $model->pic->saveAs($xlsaddr); $model->save() } return $this->render("viewname",['model'=>$model]) } ?> modle中的rule为下 <?php public function rules() { return [ [['pic', ], 'file','extensions' => 'jpg,png,jpeg,bmp,JPG,PNG,JPEG,BMP'], ]; } ?>
以上代码存在上传漏洞,即$model->validate(),这个验证对上传文件的验证为前端js验证,后台没有验证pic的文件上传。测试方法,为在浏览器设置禁用js(不会设置请百度),然后按照规则填写表单,在上传图片时,上传个php文件,如果上传成功,恭喜你,你的网站被别人搞下来了
共 3 条回复if($model->load(Yii::$app->request->post()) && $model->validate()){ ....... //上传图片 $model->pic= UploadedFile::getInstance($model, 'pic'); $t = Yii::$app->user->identity->id."_".str_replace(".",'',uniqid('',true)).mt_rand(1000,9999); $xlsaddr = 'uploads/'. $t . '.' . $model->pic->extension; //将项目移动到$xlsaddr路径位置 $model->pic->saveAs($xlsaddr); $model->save() }
我感觉你这个代码有问题,,你的model load的数据是post数据,而上传文件是在$_FILES里的,你的rules 里只有pic并且是file类型,,所以你浏览器禁用js上传一个木马文件,用$model->validate()它是可以通过验证的,
我认为正确的做法应该是$model->pic->saveAs($xlsaddr); 在保存文件之前,再次$model->validate()一下就可以了mrmoll 觉得很赞
tying
注册时间:2014-08-09
最后登录:2021-04-29
在线时长:2小时50分
最后登录:2021-04-29
在线时长:2小时50分
- 粉丝1
- 金钱70
- 威望0
- 积分90