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 相关文章推荐
文件上传程序的全部源码
Oct 09 PHP
优化PHP代码的53条建议
Mar 27 PHP
linux实现php定时执行cron任务详解
Dec 24 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
php准确计算复活节日期的方法
Apr 18 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
详解PHP中的 input属性(隐藏 只读 限制)
Aug 14 PHP
PHP中递归的实现实例详解
Nov 14 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
Apr 06 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
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
asp 的 分词实现代码
2007/05/24 Javascript
asp 取文本框名称代码
2008/12/02 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
JavaScript使用cookie实现记住账号密码功能
2015/04/27 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
python 随机数使用方法,推导以及字符串,双色球小程序实例
2017/09/12 Python
有趣的python小程序分享
2017/12/05 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
会计出纳岗位职责
2013/12/25 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
会计电算化专业求职信
2014/06/10 职场文书
历史学专业求职信
2014/06/19 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
导游欢迎词范文
2015/01/23 职场文书
同学聚会邀请函
2015/01/30 职场文书
开业庆典致辞
2015/08/01 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python