ThinkPHP中的create方法与自动令牌验证实例教程


Posted in PHP onAugust 22, 2014

本文实例形式展示了ThinkPHP中的create方法与自动令牌验证的实现方法,具体步骤如下:

一、数据表结构

user表结构如下:

id username password

二、view模板部分

\aoli\Home\Tpl\default\User\create.html页面如下:

<form action="__URL__/addit" method="post">
 <input type="text" name="id" />
 <input type="text" name="username" />
 <input type="password" name="password" />
 <input type="submit" name="sub" value="提交" />
</form>

三、action部分:

\aoli\Home\Lib\Action.php页面如下:

<?php
 class UserAction extends Action {
  function create(){
     $this->display();   
   }
   
   function addit(){
     //向表user中添加表单内容
     $user=M('user');
     $user->create();
     $user->add();
     //判断是否存在令牌验证
     if(!$user->autoCheckToken($_POST)){
       dump('no'); 
     }else{
       dump('yes');   
     }
 }
?>

1、在对表单提交过来的数据进行操作之前,我们往往需要手动创建需要的数据,例如上面提交的表单数据:

//实例化User模型
  $user=M('user');
 
 //获取表单的POST数据
  $data['username']=$_POST['username']
  $data['password']=$_POST['password']
 
 //写入到数据库
   $user->data($data)->add();

  附:使用data方法创建的数据对象不会进行自动验证和过滤操作,需要自行处理,如果只是想简单创建一个数据对象,并且不需要完成一些额外的功能的话,可以使用data方法简单的创建数据对象。

2、ThinkPHP可以帮助我们快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象。create方法创建的数据对象是保存在内存中的,并没有实际的写入到数据库中。

//实例化user模型
    $user=M('user');
  
   //根据表单提交的POST数据创建数据对象,并保存在内存中,可以通过dump($user)查看
    $user=create();

   //把创建的数据对象写入数据库中
    $user->add();

3、create方法支持从其它方式创建数据对象,如,从其它的数据对象或者数组等。

$data['name']='ThinkPHP';
   $data['eamil']='ThinkPHP@gmail.com';
   $user->create($data);

   甚至还可以支持从对象创建新的数据对象,如从user数据对象创建新的member数据对象
   $user=M('user');
   $user->find(1);
   $member=M('member');
   $member->create($user);

4、create方法在创建数据对象的同时,还完成了一些很有意义的工作,包括令牌验证、数据自动验证、字段类型查找,数据自动完成等。
  
因些,我们熟悉的令牌验证、自动验证和自动完成功能,其实都必须通过create方法才能生效。

5、令牌验证:
  
功能:可以有效防止表单的远程提交等安全防护。

   config.php中添加如下配置:

'TOKEN_ON'   =>  true, //是否开启令牌验证
   'TOKEN_NAME'  =>  'token',// 令牌验证的表单隐藏字段名称
   'TOKEN_TYPE'  =>  'md5',//令牌验证哈希规则

自动令牌会向当前SESSION会话当中放上一个md5加密的字符串。并将这个字符串以隐藏域的形式插入到表单的form之前。这个字符串出现在两个地方,一个是在SESSION当中,另一个就是在表单当中。当你提交表单后,服务器第一件事就是对比这个SESSION信息,如果正确的话,准许表单提交,否则不允许提交。

查看create.html的的源代码会看到在表单form的结束标志之前会多了一个自动生成的隐藏域

<input type="hidden" name="token" value="eef419c3d14c9c93caa7627eedaba4a5" />

(1)、如果希望自己控制隐藏域的位置,可以手动在表单页面添加 {__TOKEN__} 标识,系统会在输出模板的时候自动替换。

(2)、如果在开启表单令牌验证的情况下,个别表单不需要使用令牌验证
功能,可以在表单页面添加 {__NOTOKEN__} ,则系统会忽略当前表单的令牌验证。

(3)、如果页面中存在多个表单,建议添加 {__TOKEN__} 标识,并确保只有一个表单需要令牌验证。

(4)、如果使用create方法创建数据对象的话,会同时自动进行表单验证,如果没有使用该方法的话,则需要手动调用模型的autoCheckToken方法进行表单验证。

if (!$User->autoCheckToken($_POST)){
// 令牌验证错误
}

希望本文所示实例对大家的ThinkPHP程序设计有所帮助。

PHP 相关文章推荐
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
php构造函数实例讲解
Nov 13 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
PHP中new static()与new self()的区别异同分析
Aug 22 PHP
PHP使用json_encode函数时不转义中文的解决方法
Nov 12 PHP
图文介绍PHP添加Redis模块及连接
Jul 28 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
Symfony实现行为和模板中取得request参数的方法
Mar 17 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
Dec 28 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
ThinkPHP基本的增删查改操作实例教程
Aug 22 #PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 #PHP
ThinkPHP验证码和分页实例教程
Aug 22 #PHP
ThinkPHP文件上传实例教程
Aug 22 #PHP
ThinkPHP中ajax使用实例教程
Aug 22 #PHP
ThinkPHP中的常用查询语言汇总
Aug 22 #PHP
ThinkPHP多语言支持与多模板支持概述
Aug 22 #PHP
You might like
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
给php新手谈谈我的学习心得
2007/02/25 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
php支付宝APP支付功能
2020/07/29 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
python实现简单图书管理系统
2019/11/22 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
党员活动日总结
2014/05/05 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
爱心倡议书范文
2014/05/12 职场文书
保外就医申请书范文
2015/08/06 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python