ThinkPHP5.0.11Day09: Validate类(后端效验,后端场景效验)、文件上传与后端效验、token令牌

目录

0x00 如何效验前端发来的数据

0x01 几种常用的验证规则:

0x02 场景验证:


0x00 后端效验

index.php

<form action="register" method="post">
       <div>用户名:<input type="text" name="username"></div> 
        <div>邮箱: <input type="email" name="email" id="email"></div>
        <div>密码: <input type="password" name="pwd"  id="pwd"></div>
        <input type="submit" value="注册">
</form>

route.php中配置好路由

Route::post('register','index/indexController/register');

IndexController.php

1.配置规则:键名和post传参的参数键名匹配

2.实例化Validate类

3.接受参数

4.将参数传给Validate的check方法,判断是否满足规则

 public function register(Request $request){
      $rule = [
      'username'=>'require|length:6,12',
      'email'=>'require',
      'pwd'=>'require'
      ];
      $validate = new Validate($rule);
      $arr_data = $request->param();
      if(!$validate->check($arr_data)){
          $this->error($validate->getError(),'/tp5.0.11/public/index.php/index');
      }else{
          dump($arr_data);
      }

0x01 几种常用的验证规则:

经实践验证:

email 验证比前端HTML5的email验证更加严格。

自定义用户信息需要在Validate类实例化时传给它的构造函数。

0x02 后端场景效验:

#common文件夹:

一般在application类下有 admin 和 home 两种文件夹,这两种文件夹 都是可以浏览器可以访问的。为了实现场景效验,tp5提供了这样一种机制:允许用户创建一个同级文件夹 common ,虽然它和admin、home同级,但是浏览器无法访问common文件夹的下的内容,admin和home 中的脚本可以引入common下的内容。

(也可以将admin和home都要用到的model文件夹放在common下,通过model('数据表类名'))来实例化 model下的数据表类

步骤:

1.创建 common 文件夹

2.创建 validate文件夹

3.创建 对应场景的 php 文件 (其实就是Validate子类,继承Validate类,并重载 rule、message 等成员变量)

4.在控制器中 实例化我们创建的子类:

$validate = validate('子类名')

5.调用$validate->check(数组) 通过验证返回true ,否则返回fasle

$valiate->getError() 获取 未通过验证时的提示信息

 

UserValidate.php

<?php
namespace app\common\validate;
use think\Validate;

class UserValidate extends Validate{
    protected $rule = [
        'username'=>'require|length:6,12',
        'email'=>'require|email',
        'pwd'=>'require'
    ];
    protected $message = [
        'username'=>'好好输入用户名',
        'email.require'=>'邮箱必须输入',
        'email.email'=>'邮箱格式不正确'
    ];
}
?>

0x02文件上传 与 文件上传后端效验

配置文件(为了复用):extra/imgupload.php

<?php
return [
    'validate'=>[
        'ext'=>'jpg,gif,png',
        'size'=>'2097152'
    ],
    'path'=>'upload'//因为公开目录是public文件夹,所以upload这里相对就是public
];

文件上传类:

核心方法:

$file =  request()->file() 接收 $_FILE数组 及其他相关信息

$file->validate(效验规则) 设置效验规则, 返回值 $this

$info = $file->validate(效验规则)->move(路径) 后端效验并移动文件到指定目录。成功则返回File对象,失败则返回false。

$info->getPathName() 获取文件所在位置。

$file->getError() 获取文件上传失败的原因

参考案例:

<?php
namespace app\admin\controller;
use think\Controller;

//后台图片上传类
class Image extends Controller{
    //文件上传后端接口
    public function upload(){
        $path = config('imgupload.path');
        $validate_rule = config('imgupload.validate');

        $file = request()->file('file');
        $info = $file->validate($validate_rule)->move($path);
    
        if($info && $info->getPathName()){
            $pathname = '/'.$info->getPathName();
            $data = [
                'status'=>'success',
                'message'=>'上传图片成功!',
                'data'=>$pathname
            ];
        
        }else{
            $error = $file->getError();
            $data = [
                'status'=>'fail',
                'message'=>'上传图片失败!'.$error.'!'
            ];
        }

        echo json_encode($data);
    }
}

0x03 表单令牌验证:

为什么要有表单令牌验证?

表单提交页面需要防止恶意用户自动化批量提交,例如攻击者可以用CURL自动化POST提交

但是如果加上表单令牌,用户就必须手动按常理提交才能得到令牌

操作方法:

在表单中加入:

查看页面源代码:

所以,只有通过页面点提交的时候才会将hidden框中产生的随机值提交上去。如果用CURL模拟post提交,则很难产生正确的随机值。

然后,在验证规则中添加:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值