ThinkPHP--表单令牌和CREATE方法
表单令牌
ThinkPHP内置了表单令牌验证功能,可以有效防止表单的重复提交等安全防护。
表单令牌验证相关的配置参数有:
'TOKEN_ON'=>true, // 是否开启令牌验证 'TOKEN_NAME'=>'__hash__', // 令牌验证的表单隐藏字段名称 'TOKEN_TYPE'=>'md5', //令牌哈希验证规则 默认为MD5 'TOKEN_RESET'=>true, //令牌验证出错后是否重置令牌 默认为true
如果开启表单令牌验证功能,系统会自动在带有表单的模板文件里面自动生成以TOKEN_NAME为名称的隐藏域,其值则是TOKEN_TYPE方式生成的哈希字符串,用于实现表单的自动令牌验证。
自动生成的隐藏域位于表单Form结束标志之前,如果希望自己控制隐藏域的位置,可以手动在表单页面添加{__TOKEN__}
标识,系统会在输出模板的时候自动替换。
如果页面中存在多个表单,建议添加{__TOKEN__}标识,并确保只有一个表单需要令牌验证。
如果个别页面输出不希望进行表单令牌验证,可以在控制器中的输出方法之前动态关闭表单令牌验证,例如:
C('TOKEN_ON',false); $this->display();
模型类在创建数据对象的同时会自动进行表单令牌验证操作,如果你没有使用create方法创建数据对象的话,则需要手动调用模型的autoCheckToken方法进行表单令牌验证。如果返回false,则表示表单令牌验证错误。例如:
$User = M("User"); // 实例化User对象 // 手动进行令牌验证 if (!$User->autoCheckToken($_POST)){ // 令牌验证错误 }
CREATE:
create方法所做的工作远非这么简单,在创建数据对象的同时,完成了一系列的工作,我们来看下create方法的工作流程就能明白:
因此,我们熟悉的令牌验证、自动验证和自动完成(我们会在后面看到相关的用法)功能,其实都必须通过create方法才能生效。Create方法创建的数据对象是保存在内存中,并没有实际写入到数据库中,直到使用add或者save方法才会真正写入数据库。
因此在没有调用add或者save方法之前,我们都可以改变create方法创建的数据对象,例如:
$User = M('User'); $User->create(); //创建User数据对象 $User->status = 1; // 设置默认的用户状态 $User->create_time = time(); // 设置用户的创建时间 $User->add(); // 把用户对象写入数据库
create方法的底层在:/Lib/Core/Model.class.php
TOKEN的在:/Lib/Behavior/TokenbuildBehavior.class.php