Heim  >  Artikel  >  Backend-Entwicklung  >  Wie behebt man Cross-Site-Request-Forgery-Fehler in PHP?

Wie behebt man Cross-Site-Request-Forgery-Fehler in PHP?

王林
王林Original
2023-12-17 08:38:311118Durchsuche

Wie behebt man Cross-Site-Request-Forgery-Fehler in PHP?

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.

  1. CSRF-Token hinzufügen

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>
  1. Verwenden Sie für jeden Vorgang unterschiedliche CSRF-Tokens

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>
  1. Binden Sie IP-Adresse und Benutzeragenteninformationen

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!

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