Heim >Backend-Entwicklung >PHP-Tutorial >Analyse der Methode zum Hinzufügen von Token zum PHP-Formular, um wiederholte Übermittlungen zu verhindern

Analyse der Methode zum Hinzufügen von Token zum PHP-Formular, um wiederholte Übermittlungen zu verhindern

高洛峰
高洛峰Original
2016-12-20 15:52:001051Durchsuche

Das Beispiel in diesem Artikel beschreibt, wie man einem PHP-Formular ein Token hinzufügt, um wiederholte Übermittlungen zu verhindern. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Eine kurze Diskussion über Token

Token ist ein Token, und seine größte Eigenschaft ist Zufälligkeit und Unvorhersehbarkeit. Normale Hacker oder Software können es nicht erraten.

Was ist also die Funktion von Token? Was ist das Prinzip?

Token wird im Allgemeinen an zwei Stellen verwendet – um wiederholte Formularübermittlungen und Anti-CSRF-Angriffe (Cross-Site Request Forgery) zu verhindern.

Beides wird grundsätzlich durch Session-Tokens umgesetzt. Wenn der Client eine Seite anfordert, generiert der Server ein Zufallszahlen-Token, platziert das Token in der Sitzung und sendet es dann an den Client (normalerweise durch Erstellen eines versteckten Formulars). Wenn der Client das nächste Mal eine Anfrage sendet, wird das Token zusammen mit dem Formular an den Server übermittelt.

Wenn es dann auf „Anti-CSRF-Angriff“ angewendet wird, überprüft der Server den Token-Wert, um festzustellen, ob er mit dem Token-Wert in der Sitzung übereinstimmt. Wenn er gleich ist, kann nachgewiesen werden, dass die Anforderung gültig ist und nicht gefälscht.

Wenn es jedoch verwendet wird, um „das wiederholte Senden von Formularen zu verhindern“, wird der Token-Wert in der Sitzung nach der ersten Überprüfung aktualisiert Das zweite Überprüfungsurteil lautet: Es ist fehlgeschlagen, da sich das Token in der vom Benutzer übermittelten Form nicht geändert hat, das Token in der serverseitigen Sitzung jedoch geändert wurde.

Die obige Sitzungsanwendung ist relativ sicher, aber auch umständlich. Gleichzeitig muss bei mehreren Seiten und mehreren Anforderungen die Methode zum gleichzeitigen Generieren mehrerer Token verwendet werden, was dauert Dadurch werden mehr Ressourcen beansprucht und die Ausführungseffizienz verringert. Daher kann anstelle des Sitzungstokens auch die Methode zum Speichern von Verifizierungsinformationen in Cookies verwendet werden. Wenn es sich beispielsweise um „wiederholte Übermittlungen“ handelt, werden die übermittelten Informationen nach der ersten Übermittlung in das Cookie geschrieben. Bei der zweiten Übermittlung schlägt die zweite Übermittlung fehl, da das Cookie bereits über einen Übermittlungsdatensatz verfügt.

Allerdings hat die Cookie-Speicherung eine fatale Schwachstelle (XSS-Angriffe können Benutzer-Cookies leicht erbeuten), dann kommt es zu einem weiteren Gameover. Hacker werden CSRF-Angriffe direkt implementieren.

Analyse der Methode zum Hinzufügen von Token zum PHP-Formular, um wiederholte Übermittlungen zu verhindern

Sicherheit und Effizienz sind also relativ. Lassen Sie uns auf konkrete Themen im Detail eingehen.

Token wird zum PHP-Formular hinzugefügt, um wiederholte Übermittlungen zu verhindern

Das Prinzip besteht darin, eine zufällige Zeichenfolge zu generieren und diese in die Sitzung einzufügen. Nach dem Absenden des Formulars wird diese Zeichenfolge überprüft Verhindern Sie, dass andere das Formular selbst schreiben, um die Übermittlung zu betrügen, wiederholen Sie die Übermittlung oder doppelklicken Sie zum Absenden.

Analyse der Methode zum Hinzufügen von Token zum PHP-Formular, um wiederholte Übermittlungen zu verhindern

Der in PHP implementierte einfache Code lautet wie folgt:

<?php
/*
* PHP简单利用token防止表单重复提交
* 此处理方法纯粹是为了给初学者参考
*/
session_start();
function set_token() {
  $_SESSION[&#39;token&#39;] = md5(microtime(true));
}
function valid_token() {
  $return = $_REQUEST[&#39;token&#39;] === $_SESSION[&#39;token&#39;] ? true : false;
  set_token();
  return $return;
}
//如果token为空则生成一个token
if(!isset($_SESSION[&#39;token&#39;]) || $_SESSION[&#39;token&#39;]==&#39;&#39;) {
  set_token();
}
if(isset($_POST[&#39;test&#39;])){
  if(!valid_token()){
    echo "token error";
  }else{
    echo &#39;成功提交,Value:&#39;.$_POST[&#39;test&#39;];
  }
}
?>
<form method="post" action="">
  <input type="hidden" name="token" value="<?php echo $_SESSION[&#39;token&#39;]?>">
  <input type="text" name="test" value="Default">
  <input type="submit" value="提交" />
</form>

Die obige Methode ist einfacher und der folgende Code ist sicherer.

Token.php

<?php
/*
 * Created on 2013-3-25
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */
function getToken($len = 32, $md5 = true) {
  # Seed random number generator
  # Only needed for PHP versions prior to 4.2
  mt_srand((double) microtime() * 1000000);
  # Array of characters, adjust as desired
  $chars = array (
    &#39;Q&#39;,
    &#39;@&#39;,
    &#39;8&#39;,
    &#39;y&#39;,
    &#39;%&#39;,
    &#39;^&#39;,
    &#39;5&#39;,
    &#39;Z&#39;,
    &#39;(&#39;,
    &#39;G&#39;,
    &#39;_&#39;,
    &#39;O&#39;,
    &#39;`&#39;,
    &#39;S&#39;,
    &#39;-&#39;,
    &#39;N&#39;,
    &#39;<&#39;,
    &#39;D&#39;,
    &#39;{&#39;,
    &#39;}&#39;,
    &#39;[&#39;,
    &#39;]&#39;,
    &#39;h&#39;,
    &#39;;&#39;,
    &#39;W&#39;,
    &#39;.&#39;,
    &#39;/&#39;,
    &#39;|&#39;,
    &#39;:&#39;,
    &#39;1&#39;,
    &#39;E&#39;,
    &#39;L&#39;,
    &#39;4&#39;,
    &#39;&&#39;,
    &#39;6&#39;,
    &#39;7&#39;,
    &#39;#&#39;,
    &#39;9&#39;,
    &#39;a&#39;,
    &#39;A&#39;,
    &#39;b&#39;,
    &#39;B&#39;,
    &#39;~&#39;,
    &#39;C&#39;,
    &#39;d&#39;,
    &#39;>&#39;,
    &#39;e&#39;,
    &#39;2&#39;,
    &#39;f&#39;,
    &#39;P&#39;,
    &#39;g&#39;,
    &#39;)&#39;,
    &#39;?&#39;,
    &#39;H&#39;,
    &#39;i&#39;,
    &#39;X&#39;,
    &#39;U&#39;,
    &#39;J&#39;,
    &#39;k&#39;,
    &#39;r&#39;,
    &#39;l&#39;,
    &#39;3&#39;,
    &#39;t&#39;,
    &#39;M&#39;,
    &#39;n&#39;,
    &#39;=&#39;,
    &#39;o&#39;,
    &#39;+&#39;,
    &#39;p&#39;,
    &#39;F&#39;,
    &#39;q&#39;,
    &#39;!&#39;,
    &#39;K&#39;,
    &#39;R&#39;,
    &#39;s&#39;,
    &#39;c&#39;,
    &#39;m&#39;,
    &#39;T&#39;,
    &#39;v&#39;,
    &#39;j&#39;,
    &#39;u&#39;,
    &#39;V&#39;,
    &#39;w&#39;,
    &#39;,&#39;,
    &#39;x&#39;,
    &#39;I&#39;,
    &#39;$&#39;,
    &#39;Y&#39;,
    &#39;z&#39;,
    &#39;*&#39;
  );
  # Array indice friendly number of chars;
  $numChars = count($chars) - 1;
  $token = &#39;&#39;;
  # Create random token at the specified length
  for ($i = 0; $i < $len; $i++)
    $token .= $chars[mt_rand(0, $numChars)];
  # Should token be run through md5?
  if ($md5) {
    # Number of 32 char chunks
    $chunks = ceil(strlen($token) / 32);
    $md5token = &#39;&#39;;
    # Run each chunk through md5
    for ($i = 1; $i <= $chunks; $i++)
      $md5token .= md5(substr($token, $i * 32 - 32, 32));
    # Trim the token
    $token = substr($md5token, 0, $len);
  }
  return $token;
}
?>

form.php

<?php
include_once("token.php");
$token = getToken();
session_start();
$_SESSION[&#39;token&#39;] = $token;
?>
<form action="action.php" method="post"
<input type="hidden" name="token" value="<?=$token?>" />
<!-- 其他input submit之类的 -->
</form>

action.php

<?php
session_start();
if($_POST[&#39;token&#39;] == $_SESSION[&#39;token&#39;]){
  unset($_SESSION[&#39;token&#39;]);
  echo "这是一个正常的提交请求";
}else{
  echo "这是一个非法的提交请求";
}
?>

Ich hoffe, dieser Artikel wird allen helfen Das Design ihrer PHP-Programme hilft.

Weitere Analysen zum Hinzufügen von Token zu PHP-Formularen, um wiederholte Übermittlungen zu verhindern, finden Sie auf der chinesischen PHP-Website für verwandte Artikel!

Stellungnahme:
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