目录
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提交,则很难产生正确的随机值。
然后,在验证规则中添加: