zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    集群架构搭建
    THUWC2019 游记
    【集训队互测2015】未来程序·改
    [NOIP2014普及组T1]珠心算测验
    [CF912D]Fishes
    [POJ2409]Let it Bead
    golang 统计系统测试覆盖率
    tcpdump常用方法
    数学闯关引发的思考
    linux lsof常用方法
  • 原文地址:https://www.cnblogs.com/Hebe/p/3043680.html
Copyright © 2011-2022 走看看