この記事では主に 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 サイトの他の関連記事を参照してください。

phpssionsStrackuserdataacrossmultiplepagerequestsusingauniqueidstoredinacookie.here'showtomanageetheemefectively:1)Startassession withsession_start()andstoredatain $ _ session.2)RegeneratesseSsessidafterloginwithsession_id(the topreventes_id)

PHPでは、次の手順を通じてセッションデータを繰り返すことができます。1。session_start()を使用してセッションを開始します。 2。$ _Sessionアレイのすべてのキー価値ペアを介してforeachループを反復します。 3.複雑なデータ構造を処理する場合、is_array()またはis_object()関数を使用し、print_r()を使用して詳細情報を出力します。 4.トラバーサルを最適化する場合、ページングを使用して、一度に大量のデータの処理を避けることができます。これにより、実際のプロジェクトでPHPセッションデータをより効率的に管理および使用するのに役立ちます。

このセッションは、サーバー側の状態管理メカニズムを介してユーザー認証を実現します。 1)セッションの作成と一意のIDの生成、2)IDはCookieを介して渡されます。3)サーバーストアとIDを介してセッションデータにアクセスします。

tostoreauser'snameInappession、starthessession withsession_start()、thensignthenameto $ _session ['username']。1)ousession_start()toinitializethessession.2)assighttheuser'snameto $ _ session ['username']

PHPSESSIONの障害の理由には、構成エラー、Cookieの問題、セッションの有効期限が含まれます。 1。構成エラー:正しいセッションをチェックして設定します。save_path。 2.Cookieの問題:Cookieが正しく設定されていることを確認してください。 3.セッションの有効期限:セッションを調整してください。GC_MAXLIFETIME値はセッション時間を延長します。

PHPでセッションの問題をデバッグする方法は次のとおりです。1。セッションが正しく開始されるかどうかを確認します。 2.セッションIDの配信を確認します。 3.セッションデータのストレージと読み取りを確認します。 4.サーバーの構成を確認します。セッションIDとデータを出力し、セッションファイルのコンテンツを表示するなど、セッション関連の問題を効果的に診断して解決できます。

session_start()への複数の呼び出しにより、警告メッセージと可能なデータ上書きが行われます。 1)PHPは警告を発し、セッションが開始されたことを促します。 2)セッションデータの予期しない上書きを引き起こす可能性があります。 3)session_status()を使用してセッションステータスを確認して、繰り返しの呼び出しを避けます。

PHPでのセッションライフサイクルの構成は、session.gc_maxlifetimeとsession.cookie_lifetimeを設定することで達成できます。 1)session.gc_maxlifetimeサーバー側のセッションデータのサバイバル時間を制御します。 0に設定すると、ブラウザが閉じているとCookieが期限切れになります。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ホットトピック









