Heim Backend-Entwicklung PHP-Tutorial Analyse und Behebung von Formular-Token-Fehlern unter ThinkPHP

Analyse und Behebung von Formular-Token-Fehlern unter ThinkPHP

Jan 03, 2018 am 11:45 AM
php thinkphp 解决

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
Nach dem Login kopieren

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()));
}
Nach dem Login kopieren

. 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=&#39;&#39;,$type=&#39;&#39;) {
  ……省略……
  // 表单令牌验证
  if(!$this->autoCheckToken($data)) {
    $this->error = L(&#39;_TOKEN_ERROR_&#39;);
    return false;
  }
  ……省略……
}
Nach dem Login kopieren
Wenn Sie den Code sehen, werden Sie verstehen, dass ein Fehler gemeldet wird, wenn die Methode autoCheckToken nicht erkannt wird, und diese Methode dann weiter verfolgen


// 自动表单令牌验证
// TODO ajax无刷新多次提交暂不能满足
public function autoCheckToken($data) {
  // 支持使用token(false) 关闭令牌验证
  // 如果在Action写了D方法,但没有对应的Model文件,那么$this->options为空
  if(isset($this->options[&#39;token&#39;]) && !$this->options[&#39;token&#39;]) return true;
  if(C(&#39;TOKEN_ON&#39;)){
    $name  = C(&#39;TOKEN_NAME&#39;);
    if(!isset($data[$name]) || !isset($_SESSION[$name])) { // 令牌数据无效
      return false;
    }
    // 令牌验证
    list($key,$value) = explode(&#39;_&#39;,$data[$name]);
    if($value && $_SESSION[$name][$key] === $value) { // 防止重复提交
      unset($_SESSION[$name][$key]); // 验证完成销毁session
      return true;
    }
    // 开启TOKEN重置
    if(C(&#39;TOKEN_RESET&#39;)) unset($_SESSION[$name][$key]);
    return false;
  }
  return true;
}
Nach dem Login kopieren
Nachdem Sie diesen Code gelesen haben, werden Sie feststellen, dass das Urteil $_SESSION[$name] enthält. Woher kommt also diese Seesionsvariable? Dies muss beim Generieren des Tokens beginnen die Datei TokenBuildBehavior.class.php


// 创建表单令牌
private function buildToken() {
  $tokenName = C(&#39;TOKEN_NAME&#39;);
  $tokenType = C(&#39;TOKEN_TYPE&#39;);
  if(!isset($_SESSION[$tokenName])) {
    $_SESSION[$tokenName] = array();
  }
  // 标识当前页面唯一性
  $tokenKey  = md5($_SERVER[&#39;REQUEST_URI&#39;]);
  if(isset($_SESSION[$tokenName][$tokenKey])) {// 相同页面不重复生成session
    $tokenValue = $_SESSION[$tokenName][$tokenKey];
  }else{
    $tokenValue = $tokenType(microtime(TRUE));
    $_SESSION[$tokenName][$tokenKey]  = $tokenValue;
  }
  $token   = &#39;<input type="hidden" name="&#39;.$tokenName.&#39;" value="&#39;.$tokenKey.&#39;_&#39;.$tokenValue.&#39;" />&#39;;
  return $token;
}
Nach dem Login kopieren
Dieser Code wird hauptsächlich zum Generieren eines Tokenwerts unter Verwendung von TOKEN_NAME und dem MD5 des aktuellen URI verwendet, wenn TP die Formularüberprüfung aktiviert, wenn der Benutzer das übermittelt Wenn nicht, wird „false“ zurückgegeben. Wenn dies der Fall ist, wird die Sitzung zuerst gelöscht (um zu vermeiden, dass der Formular-Token-Fehler beim nächsten Mal gesendet wird). Geben Sie true zurück, andernfalls geben Sie false zurück.


ok, zurück zum Thema, es gibt nur zwei Möglichkeiten für Token-Fehler bei der Formularübermittlung unter TP

1 Senden mit aktiviertem Token. Im Formular gibt es keinen TOKEN_NAME Feld oder keine entsprechende Sitzung (in der aktuellen Übermittlungsformularumgebung wird keine entsprechende Sitzung generiert. Dies liegt hauptsächlich daran, dass nach dem Absenden durch den Benutzer ein Fehler gemeldet wird und der Benutzer dann die aktuelle Seite aktualisiert. Gleichzeitig werden die Bearbeitungsseite und die Anzeigeseite sind in der gleichen Methode)

2. Es gibt eine Sitzungsvariable, aber die Vorher- und Nachherwerte sind unterschiedlich

Der Grund, warum dieser Fehler in unserem Projekt auftritt, können Sie finden Schauen Sie sich die folgende Konfiguration an

return array (
  &#39;TOKEN_ON&#39; => &#39;false&#39;,
  &#39;TOKEN_NAME&#39; => &#39;__hash__&#39;,
  &#39;TOKEN_TYPE&#39; => &#39;md5&#39;,
  &#39;TOKEN_RESET&#39; => &#39;true&#39;,
  &#39;DB_FIELDTYPE_CHECK&#39; => &#39;true&#39;
);
Nach dem Login kopieren
Es sollte sein: Wenn false als boolescher Wert geschrieben wird, weiß ich nicht, welcher Held ihn so geschrieben hat, dass er als Zeichenfolge falsch ist. Dann wird das Urteil natürlich basieren In Bezug auf die Logik des Öffnens des Formular-Tokens sind das Hinzufügen, Bearbeiten und Anzeigen im Projekt alle dieselben Methoden. Sobald ein Überprüfungsfehler auftritt, kehrt die allgemeine Programmverarbeitungslogik zur ursprünglichen Schnittstelle zurück und es handelt sich um dasselbe Formular Wie beim letzten Mal entspricht die kontinuierliche Übermittlung desselben Formulars einer wiederholten Übermittlung, dann wird ein „Formular-Token-Fehler“ gemeldet.


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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

CakePHP-Kurzanleitung CakePHP-Kurzanleitung Sep 10, 2024 pm 05:27 PM

CakePHP ist ein Open-Source-MVC-Framework. Es erleichtert die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich. CakePHP verfügt über eine Reihe von Bibliotheken, um die Überlastung der häufigsten Aufgaben zu reduzieren.

Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

See all articles