Maison  >  Article  >  développement back-end  >  Comment résoudre les erreurs de falsification de requêtes intersites en PHP ?

Comment résoudre les erreurs de falsification de requêtes intersites en PHP ?

王林
王林original
2023-12-17 08:38:311169parcourir

Comment résoudre les erreurs de falsification de requêtes intersites en PHP ?

L'attaque CSRF (Cross-site request forgery) est un moyen courant d'attaque réseau, et elle ne fait pas exception dans les applications en PHP. Il utilise le statut de connexion de l'utilisateur pour mener des attaques et se déguise en utilisateur légitime pour soumettre des requêtes malveillantes en construisant de fausses requêtes, causant ainsi des dommages. Cet article présentera comment éliminer les vulnérabilités CSRF dans les applications PHP, y compris des exemples de code spécifiques et une analyse détaillée.

  1. Ajouter un jeton CSRF

Les attaques CSRF contournent le mécanisme de protection du site Web en falsifiant des requêtes. Une méthode de contournement courante est l'attaque par « mot de passe ». Pour éviter cette attaque, un token CSRF doit être ajouté aux formulaires du site.

Code backend :

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
    session_start();
    if($_POST['csrf_token'] == $_SESSION['csrf_token']){
        //请求数据合法,执行操作
    }else{
        //CSRF令牌不合法
    }
}
?>

Code frontend :

<form method="POST" action="submit.php">
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
    <!-- 其他表单数据 -->
    <button type="submit">提交</button>
</form>
  1. Utilisez différents jetons CSRF pour chaque opération

Pour améliorer encore la sécurité, différents jetons CSRF doivent être utilisés pour différentes opérations.

Code back-end :

<?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']);
    //请求数据合法,执行操作
}
?>

Code frontal :

<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. Lier l'adresse IP et les informations de l'agent utilisateur

Le but de l'attaque CSRF est de contourner la vérification de sécurité du site Web, et les mesures préventives sont principalement ajouté pendant le processus de soumission du formulaire Mécanisme de vérification. Pour améliorer encore la sécurité, le jeton CSRF peut être lié à l'utilisateur.

Code back-end :

<?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;
?>

Code front-end :

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

Grâce aux méthodes ci-dessus, les vulnérabilités CSRF dans les applications PHP peuvent être efficacement éliminées. Il convient toutefois de noter que ces méthodes ne sont pas absolument fiables et doivent être adaptées et améliorées en fonction de la situation réelle. Dans le même temps, vous devez éviter de transmettre des jetons CSRF dans des URL ou des cookies pour éviter d'introduire de nouveaux risques de sécurité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn