tying 2017-01-23 11:14:34 8576次浏览 6条回复 1 0 0

model中关于文件上文限制,只进行了前台的js判断,开发人员请在后台也进行判断上传的文件,否则浏览器禁用js可以直接上传脚本文件等不安全文件,如果服务器在不进行权限及访问文件类型控制,可能服务器权限被夺,下为没有进行文件的上传过滤代码

$model->file = UploadedFile::getInstance($model, 'file');
$xlsaddr = 'uploads/' . $model->file->baseName . '_' . $t .".". $model->file->extension;
$model->file->saveAs($xlsaddr);
  • 回复于 2017-01-23 11:57 举报

    于是你在saveAs()的前面先行验证下就可以了:
    if ($model->validate())
    model...

    3 条回复
    回复于 2017-02-09 10:32 回复

    你试下好了,不想多做解释

    回复于 2017-02-09 10:32 回复

    你试下好了,不想多做解释

    回复于 2017-02-09 13:35 回复

    这就像 1+1=2 一样,我只是给您提个醒,有什么需要试的吗?

    , 觉得很赞
  • 回复于 2017-01-25 14:28 举报

    是啊,要验证的,不验证的话啥都能传

    if ($model->validate())
    
    1 条回复
    回复于 2017-02-09 10:32 回复

    你试下好了,不想多做解释,版本是yii2.0.7

  • 回复于 2017-02-10 14:22 举报

    我解释下吧,不然可能会让其他人误会
    在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 条回复
    回复于 2018-11-02 16:08 回复
    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()一下就可以了

    回复于 2019-07-22 11:52 回复

    嗯,是这样的。我已经说明了我上面的代码是存在漏洞的。也有可能是我没有表述清楚吧

    回复于 2021-07-15 23:59 回复

    这种遇到上传文件的,肯定不能完全靠model呀,要单独验证上传文件呀

    觉得很赞
  • 回复于 2017-02-10 14:37 举报

    这话题只留三天,过后删掉,东西比较敏感

  • 回复于 2017-02-10 18:14 举报

    你自定义一个验证规则,每次上传的时候在后台查查文件头是否有你需要的文件前缀

    1 条回复
    回复于 2017-02-13 09:53 回复

    嗯,也可以

  • 回复于 2017-02-13 10:05 举报

    声明:
    我发起这个话题的初衷
    一是为了让官方看看能不能通过更新版本源码修补下这个安全漏洞
    二是为了让不知道这个漏洞的程序能够看到,增加自己网站的安全性,要是您的防火墙和或者安装了什么硬件防护buff什么的,护非常牛逼,不需要理会安全漏洞,可以当这个话题时是个屁放了
    至于解决方案,方法千千万,大家可以相互讨论下,达到效果就好

您需要登录后才可以回复。登录 | 立即注册