Cross-Site Request Forgery (CSRF)-Angriffe sind ein gängiges Mittel für Netzwerkangriffe und bilden bei Anwendungen in PHP keine Ausnahme. Es nutzt den Anmeldestatus des Benutzers, um Angriffe auszuführen, und tarnt sich als legitimer Benutzer, um böswillige Anfragen zu stellen, indem es gefälschte Anfragen erstellt und so Schaden anrichtet. In diesem Artikel wird erläutert, wie Sie CSRF-Schwachstellen in PHP-Anwendungen beseitigen können, einschließlich spezifischer Codebeispiele und detaillierter Analysen.
CSRF-Angriffe umgehen den Schutzmechanismus der Website, indem sie Anfragen fälschen. Eine häufige Umgehungsmethode ist der „Passwort“-Angriff. Um diesen Angriff zu verhindern, muss den Formularen der Website ein CSRF-Token hinzugefügt werden.
Backend-Code:
<?php if($_SERVER['REQUEST_METHOD'] == 'POST'){ session_start(); if($_POST['csrf_token'] == $_SESSION['csrf_token']){ //请求数据合法,执行操作 }else{ //CSRF令牌不合法 } } ?>
Frontend-Code:
<form method="POST" action="submit.php"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"> <!-- 其他表单数据 --> <button type="submit">提交</button> </form>
Um die Sicherheit weiter zu verbessern, sollten für verschiedene Vorgänge unterschiedliche CSRF-Tokens verwendet werden.
Back-End-Code:
<?php //生成新的CSRF令牌 function generate_csrf_token(){ return md5(mt_rand(1, 1000000) . microtime()); } //验证CSRF令牌 function validate_csrf_token($token){ if(!isset($_SESSION['csrf_token']) || $_SESSION['csrf_token'] !== $token){ die("CSRF Token验证失败"); } } //生成CSRF令牌 if(!isset($_SESSION['csrf_token'])){ //不存在令牌,生成新的令牌 $_SESSION['csrf_token'] = generate_csrf_token(); } //用户提交的数据需要先进行CSRF令牌验证 if($_SERVER['REQUEST_METHOD'] == 'POST'){ validate_csrf_token($_POST['csrf_token']); //请求数据合法,执行操作 } ?>
Front-End-Code:
<form method="POST" action="submit.php"> <input type="hidden" name="csrf_token" value="<?php echo generate_csrf_token(); ?>"> <input type="hidden" name="action" value="delete"> <input type="hidden" name="id" value="123"> <button type="submit">删除用户</button> </form>
Der Zweck des CSRF-Angriffs besteht darin, die Sicherheitsüberprüfung der Website zu umgehen, und dies sind hauptsächlich vorbeugende Maßnahmen Während des Formularübermittlungsprozesses hinzugefügter Verifizierungsmechanismus. Um die Sicherheit weiter zu erhöhen, kann das CSRF-Token an den Benutzer gebunden werden.
Back-End-Code:
<?php //生成新的CSRF令牌 function generate_csrf_token(){ return md5(mt_rand(1, 1000000) . microtime()); } //验证CSRF令牌 function validate_csrf_token($token){ if(!isset($_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']]) || !in_array($_SERVER['HTTP_USER_AGENT'], $_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']])){ die("CSRF Token验证失败"); } if(!isset($_SESSION['csrf_tokens'][$token])){ die("CSRF Token验证失败"); }else{ unset($_SESSION['csrf_tokens'][$token]); } } //生成CSRF令牌 if(!isset($_SESSION['csrf_tokens'])){ $_SESSION['csrf_tokens'] = []; } if(!isset($_SESSION['csrf_ips'])){ $_SESSION['csrf_ips'] = []; } if(!isset($_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']])){ $_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']] = [$_SERVER['HTTP_USER_AGENT']]; }else{ $_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']][] = $_SERVER['HTTP_USER_AGENT']; //限制用户代理 if(count($_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']]) > 3){ array_shift($_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']]); } } $new_token = generate_csrf_token(); $_SESSION['csrf_tokens'][$new_token] = true; ?>
Front-End-Code:
<form method="POST" action="submit.php"> <input type="hidden" name="csrf_token" value="<?php echo $new_token; ?>"> <input type="hidden" name="action" value="delete"> <input type="hidden" name="id" value="123"> <button type="submit">删除用户</button> </form>
Durch die oben genannten Methoden können CSRF-Schwachstellen in PHP-Anwendungen effektiv beseitigt werden. Es ist jedoch zu beachten, dass diese Methoden nicht absolut zuverlässig sind und je nach tatsächlicher Situation angepasst und verbessert werden müssen. Gleichzeitig müssen Sie die Weitergabe von CSRF-Tokens an URLs oder Cookies vermeiden, um neue Sicherheitsrisiken zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie behebt man Cross-Site-Request-Forgery-Fehler in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!