この記事では主に ThinkPHP でのフォーム トークンのエラーと解決策を紹介し、thinkPHP フォーム トークンの原理、構成、エラーの原因と対応する解決策を詳しく分析します。必要な方は参考にしてください。 ThinkPHP でトークンを形成するためのソリューション。詳細は次のとおりです:
プロジェクトの開発プロセス中、データの追加と編集時にシステムによってプロンプトが表示される「フォームトークンエラー」が発生することがありました。今日の午後に QA がバグ システムについて報告するまで、最初は注意していましたが、たまたま時間があったので TP3.13 のソース コードを読んで、数分後に気づきました。一部始終。
プロジェクトでフォームトークンを有効にするには、通常、設定ファイルで次の設定を行う必要があります
// 是否开启令牌验证 'TOKEN_ON' => true, // 令牌验证的表单隐藏字段名称 'TOKEN_NAME' => '__hash__', //令牌哈希验证规则 默认为MD5 'TOKEN_TYPE' => 'md5', //令牌验证出错后是否重置令牌 默认为true 'TOKEN_RESET' => true
例としてデータを編集する場合、通常はフィールドフィルタリングルールを備えたモデルがサーバー側にあります。
$table = D('table'); if(!$table->create()){ exit($this->error($table->getError())); }
などのデータ検出コードによるアクションコードを見ると、autoCheckToken メソッドが検出されたことがわかります。失敗した場合はエラーが報告されます。その後、このメソッドに従ってください
/** * 创建数据对象 但不保存到数据库 * @access public * @param mixed $data 创建数据 * @param string $type 状态 * @return mixed */ public function create($data='',$type='') { ……省略…… // 表单令牌验证 if(!$this->autoCheckToken($data)) { $this->error = L('_TOKEN_ERROR_'); return false; } ……省略…… }
このコードを読むと、$_SESSION[ があることがわかります。最初の判断では、このセッション変数はどこから来たのでしょうか? これは、トークンを生成するときに開始する必要があり、TokenBuildBehavior.class.php ファイルを見つけます
// 自动表单令牌验证 // TODO ajax无刷新多次提交暂不能满足 public function autoCheckToken($data) { // 支持使用token(false) 关闭令牌验证 // 如果在Action写了D方法,但没有对应的Model文件,那么$this->options为空 if(isset($this->options['token']) && !$this->options['token']) return true; if(C('TOKEN_ON')){ $name = C('TOKEN_NAME'); if(!isset($data[$name]) || !isset($_SESSION[$name])) { // 令牌数据无效 return false; } // 令牌验证 list($key,$value) = explode('_',$data[$name]); if($value && $_SESSION[$name][$key] === $value) { // 防止重复提交 unset($_SESSION[$name][$key]); // 验证完成销毁session return true; } // 开启TOKEN重置 if(C('TOKEN_RESET')) unset($_SESSION[$name][$key]); return false; } return true; }
このコードは主にトークンを生成するために使用されます。 TP がフォーム検証を有効にするときに、TOKEN_NAME と現在の URI の md5 を使用して、ユーザーがフォームを送信するときに、最初にセッションが存在するかどうかを確認し、存在しない場合は false を返します。 TOKEN_NAME。一貫性がある場合はセッションを削除します (実質的に、次回のフォーム コマンドの送信が回避されます)。そうでない場合は false を返します。
さて、本題に戻りますが、TP
1 でフォームを送信するときにトークン エラーが発生する可能性は 2 つだけです。トークンがオンになっている場合、送信されたフォーム セッションに TOKEN_NAME フィールドまたは対応するフィールドが存在しません。現在の送信フォーム環境では、対応するセッションは生成されません。これは主に、ユーザーが送信した後にエラーが報告され、同時に編集ページと表示ページが同じメソッドであるためです。
2.セッション変数がありますが、前後の値が異なります
このプロジェクトでこのエラーが発生する理由は、以下の設定を参照してください
// 创建表单令牌 private function buildToken() { $tokenName = C('TOKEN_NAME'); $tokenType = C('TOKEN_TYPE'); if(!isset($_SESSION[$tokenName])) { $_SESSION[$tokenName] = array(); } // 标识当前页面唯一性 $tokenKey = md5($_SERVER['REQUEST_URI']); if(isset($_SESSION[$tokenName][$tokenKey])) {// 相同页面不重复生成session $tokenValue = $_SESSION[$tokenName][$tokenKey]; }else{ $tokenValue = $tokenType(microtime(TRUE)); $_SESSION[$tokenName][$tokenKey] = $tokenValue; } $token = '<input type="hidden" name="'.$tokenName.'" value="'.$tokenKey.'_'.$tokenValue.'" />'; return $token; }
ブール値としては false ですが、どのヒーローがそれを文字列として false として書いたかはわかりません。その場合、もちろん、判断はフォーム トークンを開き、プロジェクト内で追加、編集、表示するロジックに基づいて行われます。検証エラーが発生すると、一般的なプログラム処理ロジックは元のインターフェイスに戻ります。同じフォームを継続的に送信すると、同じフォームが繰り返し送信されることになります。 , その場合、「フォームトークンエラー」が報告されます。
関連する推奨事項:
thinkPHP がチェックイン機能を実装する方法thinkphp は Excel データのインポートとエクスポートを実装します (完全なケースが添付されています)
以上がThinkPHP でのフォーム トークン エラーの分析と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。