mrmoll
- mrmoll 赞了回复
于是你在saveAs()的前面先行验证下就可以了:
if ($model->validate())
是model
... - mrmoll 赞了回复
我解释下吧,不然可能会让其他人误会
在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文件,如果上传成功,恭喜你,你的网站被别人搞下来了
我解释下吧,不然可能会让其他人误会
在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文件,如果上传成功,恭喜你,你的网站被别人搞下来了
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()一下就可以了放到我的代码里有module的 /module/controller/action路径没问题,如果是没有module的/controller/action路径就只能是全等的时候才高亮。
我增加了一段 如果当前path是2个元素 就是没有module的,比较下标为0也就是第一个元素,如果是3个元素就是有module的,比较下标为1也就是第二个元素
$route = ltrim($route,'/'); $route = explode('/', $route); $path = explode('/', $this->route); /*下面是增加的部分start*/ $pathCount=count($path); if ($pathCount == 2 && $route[0] != $path[0] && $route !== $this->noDefaultRoute && $route !== $this->noDefaultAction) { return false; } /*上面是增加的部分end*/ //下面要判断$pathCount==3 if ($pathCount == 3 && $route[1] != $path[1] && $route !== $this->noDefaultRoute && $route !== $this->noDefaultAction) { return false; }
- mrmoll 赞了回答
多个条件灵活拼什么拼 条件个数不定 怎么拼接?尽说这种一个条件或者条件个数特定的 一群垃圾
首先这个和环境没关系的;需要配置下允许访问ip;默认是127.0.0.1;
'bootstrap' => ['debug'], 'modules' => [ 'debug' => [ 'class' => 'yii\debug\Module', 'allowedIPs' => ['你的服务器ip', '127.0.0.1', '::1'] ] ]
我今天刚从官网上下载yii2 advanced安装包 本地windows执行了init.bat其他什么也没改,我看了配置文件 默认没有allowedIps这个参数,访问网站debug功能正常,然后我把文件包复制到虚拟机的centos系统中 再访问底部的debug就看不到了 ,手动浏览debug地址 报403错误
- mrmoll 发布了话题AR如何查询两个字段相等的记录
- mrmoll 2016-09-22 已签到连续签到1天,获得了5个金钱