关于 ImageUploadHandler.php 类的疑问?

上传的图片的后缀名首先经过了表单的验证,教程代码如下

class UserRequest extends FormRequest
{
...
    public function rules()
    {
        return [
            'name' => 'required|between:3,25|regex:/^[A-Za-z0-9\-\_]+$/|unique:users,name,' . Auth::id(),
            'email' => 'required|email',
            'introduction' => 'max:80',
            //这里对传入的图片类型已经进行了验证
            'avatar' => 'mimes:jpeg,bmp,png,gif|dimensions:min_width=200,min_height=200',  
        ];
    }
...
}

为何ImageUploadHandler.php 类中还要继续对后缀名进行重复验证,教程代码如下

<?php

namespace App\Handlers;

class ImageUploadHandler
{

 ...
    public function save($file, $folder, $file_prefix)
    {
...
        // 此处仍旧进行第二次验证后缀名
        if ( ! in_array($extension, $this->allowed_ext)) {
            return false;
        }
...
}

这两次验证都是后台进行的重复验证,是否多此一举?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

@soypablo 我明白你的意思了,我理解他应该是这样的,第一次是验证的 Request 数据,第二次是验证的 ImageUploadHandler 这个类的数据,因为不能保证使用这个类的时候数据是被验证过的,单单从这个过程来说,应该是没有意义了。

我自己用的时候就把整个类都改了,将验证单独提取出来了,如果数据是被验证过了,就不去验证,如果没有验证就使用我自定义的方法前置一下。

public function validateUpload(Request $request, $field)
    {
        $rules = [
            $field => 'bail|required|file|mimes:' . implode($this->allowed_ext, ',') . '|max:' . $this->max_size,
        ];
        $messages = [
            $field . '.file'  => '文件上传失败',
            $field . '.mimes' => '上传失败,文件类型不允许,请上传常规的图片 ' . implode($this->allowed_ext, ',') . '文件',
            $field . '.max'   => '上传失败,文件过大,文件大小不得超出 ' . $this->max_size . ' KB。',
        ];
        $validator = Validator::make($request->all(), $rules, $messages);
        if ($validator->fails()) {
            $fail = [
                'success' => 0,
                'message' => $validator->errors()->first($field),
                'url'     => '',
            ];
            return $fail;
        }
    }

完整代码 你可以参考下

2年前 评论
讨论数量: 6

工具类是会在其他地方多方调用的。在此处接收的参数是已经经过验证的数据,但不代表在其他地方调用时,参数就一定经过后端验证。所以此验证加入到类文件里比较保险

2年前 评论

不要相信前台提交过来的任何数据,不管前台是否验证,只要有风险的数据 PHP 都要验证,PHP 的验证是要保证数据的准确性,前台的验证是为了提升用户体验

2年前 评论

楼上的兄弟,谢谢你的回复,但是你没理解我的意思,这两次验证都是发生在后台

2年前 评论

@soypablo 我明白你的意思了,我理解他应该是这样的,第一次是验证的 Request 数据,第二次是验证的 ImageUploadHandler 这个类的数据,因为不能保证使用这个类的时候数据是被验证过的,单单从这个过程来说,应该是没有意义了。

我自己用的时候就把整个类都改了,将验证单独提取出来了,如果数据是被验证过了,就不去验证,如果没有验证就使用我自定义的方法前置一下。

public function validateUpload(Request $request, $field)
    {
        $rules = [
            $field => 'bail|required|file|mimes:' . implode($this->allowed_ext, ',') . '|max:' . $this->max_size,
        ];
        $messages = [
            $field . '.file'  => '文件上传失败',
            $field . '.mimes' => '上传失败,文件类型不允许,请上传常规的图片 ' . implode($this->allowed_ext, ',') . '文件',
            $field . '.max'   => '上传失败,文件过大,文件大小不得超出 ' . $this->max_size . ' KB。',
        ];
        $validator = Validator::make($request->all(), $rules, $messages);
        if ($validator->fails()) {
            $fail = [
                'success' => 0,
                'message' => $validator->errors()->first($field),
                'url'     => '',
            ];
            return $fail;
        }
    }

完整代码 你可以参考下

2年前 评论

工具类是会在其他地方多方调用的。在此处接收的参数是已经经过验证的数据,但不代表在其他地方调用时,参数就一定经过后端验证。所以此验证加入到类文件里比较保险

2年前 评论

避免写重复的验证代码

2年前 评论

图片的验证逻辑复杂 单独抽处理作为工具类比较合理 后期改动验证规则方便 是个不错的设计

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!