Wie behebt man den Formular-Token-Fehler unter ThinkPHP? In diesem Artikel werden hauptsächlich Form-Token-Fehler und -Lösungen unter ThinkPHP vorgestellt und die Prinzipien, Konfigurationen, Fehlerursachen und entsprechenden Lösungen von thinkPHP-Form-Tokens detaillierter analysiert. Freunde in Not können darauf verweisen. Ich hoffe, dass es für alle hilfreich ist.
Die Details sind wie folgt:
Während des Entwicklungsprozesses des Projekts ist mir beim Hinzufügen und Bearbeiten von Daten, die ich nicht bezahlt habe, gelegentlich der „Formular-Token-Fehler“ aufgefallen Anfangs war ihm viel Aufmerksamkeit geschenkt, bis der Qualitätssicherungsdienst heute Nachmittag dem Fehlersystem gegenüber etwas Freizeit hatte, also folgte er dem Quellcode von TP3.13 und las ihn nach ein paar Minuten ganze Geschichte.
Um Formular-Tokens im Projekt zu aktivieren, müssen Sie normalerweise die folgende Konfiguration in der Konfigurationsdatei vornehmen
// 是否开启令牌验证 'TOKEN_ON' => true, // 令牌验证的表单隐藏字段名称 'TOKEN_NAME' => '__hash__', //令牌哈希验证规则 默认为MD5 'TOKEN_TYPE' => 'md5', //令牌验证出错后是否重置令牌 默认为true 'TOKEN_RESET' => true
Nehmen Sie Bearbeitungsdaten als Beispiel. Normalerweise gibt es ein Modell auf dem Server Seite mit darauf geschriebenen Feldfilterregeln. Die Aktion schreibt den Datenerkennungscode, z. B.
$table = D('table'); if(!$table->create()){ exit($this->error($table->getError())); }
. Doppelklicken Sie dann in der IDE auf create(), um die Erstellungsmethode
< zu finden 🎜 in Model.class.php im TP-Framework >
/** * 创建数据对象 但不保存到数据库 * @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; } ……省略…… }
// 自动表单令牌验证 // 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; }
// 创建表单令牌 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; }
return array ( 'TOKEN_ON' => 'false', 'TOKEN_NAME' => '__hash__', 'TOKEN_TYPE' => 'md5', 'TOKEN_RESET' => 'true', 'DB_FIELDTYPE_CHECK' => 'true' );
Verwandte Empfehlungen:
Detaillierte Erläuterung der Verhaltenserweiterungen und Plug-ins von ThinkPHP
Detaillierte Erklärung, wie ThinkPHP Verifizierungscodes generiert und überprüft
Detaillierte Erklärung der thinkphp5-URL und Routing-Funktionen mit Beispielen
Das obige ist der detaillierte Inhalt vonAnalyse und Behebung von Formular-Token-Fehlern unter ThinkPHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!