Heim > Artikel > Backend-Entwicklung > PHP-Formular verhindert wiederholte Übermittlung (Anti-CSRF-Sicherheitslücke)
Der Inhalt dieses Artikels befasst sich mit der Verhinderung der wiederholten Übermittlung von PHP-Formularen (Verhinderung von CSRF-Schwachstellen). Jetzt kann ich ihn mit Ihnen teilen.
Token Eine kurze Diskussion
Token ist ein Token. 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 bewiesen werden, gültig, nicht gefälscht.
Wenn es jedoch verwendet wird, um „die wiederholte Übermittlung von Formularen zu verhindern“, wird der Token-Wert in der Sitzung nach der ersten Überprüfung derselben auf der Serverseite aktualisiert Wenn der Benutzer wiederholt einreicht, schlägt die sekundäre Überprüfungsbeurteilung fehl, 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 ist die Methode zum gleichzeitigen Generieren mehrerer Token erforderlich verwendet werden, was 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.
Die Cookie-Speicherung hat jedoch eine fatale Schwäche. Wenn das Cookie gekapert wird (XSS-Angriffe können Benutzercookies leicht erbeuten), kommt es zu einem weiteren Gameover. Hacker werden CSRF-Angriffe direkt implementieren.
1. Verhindern Sie zuerst XSS-Angriffe
2. Überprüfen Sie den Referrer
3. Wichtige Cookie-Einstellungen sind nur https, z. B. Token
4 . Verwenden Sie Signatur, Token
5. get wird nur zum Abfragen von Informationen verwendet
6. Verwenden Sie Post, um das Formular abzusenden
7 . Verwenden Sie Cross-Text mit Vorsicht. Script-Injection
Sicherheit und Effizienz sind also relativ. Lassen Sie uns auf konkrete Themen im Detail eingehen.
Token zum PHP-Formular hinzufügen, um wiederholte Übermittlungen zu verhindern
Das Prinzip besteht darin, einen Zufall zu generieren Zeichenfolge und fügen Sie sie in die Sitzung ein. Hier kann die Überprüfung dieser Zeichenfolge nach dem Absenden des Formulars verhindern, dass andere das Formular selbst schreiben, um die Übermittlung zu betrügen, die Übermittlung zu wiederholen oder auf die Übermittlung doppelklicken.
Der in PHP implementierte einfache Code lautet wie folgt:
<?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_SESSION['token'] = md5(microtime(true)); } function valid_token() { $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false; set_token(); return $return; } //如果token为空则生成一个token if(!isset($_SESSION['token']) || $_SESSION['token']=='') { set_token(); } if(isset($_POST['test'])){ if(!valid_token()){ echo "token error"; }else{ echo '成功提交,Value:'.$_POST['test']; } } ?> <form method="post" action=""> <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>"> <input type="text" name="test" value="Default"> <input type="submit" value="提交" /> </form>
|
上面的比较简单一点的方法,下面的代码更加安全一点.
Token.php
|
<?php include_once("token.php"); $token = getToken(); session_start(); $_SESSION['token'] = $token; ?> <form action="action.php" method="post" <input type="hidden" name="token" value="<?=$token?>" /> <!-- 其他input submit之类的 --> </form>
|
<?php session_start(); if($_POST['token'] == $_SESSION['token']){ unset($_SESSION['token']); echo "这是一个正常的提交请求"; }else{ echo "这是一个非法的提交请求"; } ?>
|
<span style="margin:0px;padding:0px;"></span>
action.php
|
<span style="margin:0px;padding:0px;"></span>
Das Problem der Verwendung von Variablen zur Darstellung des PHP-Formularnamenwerts
Detaillierte Erläuterung des Beispiels für den asynchronen Upload einer PHP-Formulardatei im Iframe
Das obige ist der detaillierte Inhalt vonPHP-Formular verhindert wiederholte Übermittlung (Anti-CSRF-Sicherheitslücke). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!