Maison  >  Article  >  développement back-end  >  PHP implémente une programmation sécurisée : attaque et défense CSRF

PHP implémente une programmation sécurisée : attaque et défense CSRF

WBOY
WBOYoriginal
2023-06-18 12:22:041258parcourir

Dans les applications Internet, les questions de sécurité ont toujours été un enjeu important. Parmi elles, l’attaque Cross-Site Request Forgery (CSRF) est une vulnérabilité courante et facilement exploitée par les attaquants. Alors, comment implémenter une programmation sécurisée dans le développement PHP ? Cet article se concentrera sur les attaques CSRF et les solutions de défense.

1. Qu'est-ce que l'attaque CSRF ?

L'attaque CSRF, c'est-à-dire la falsification de requêtes intersites, est une méthode d'attaque qui utilise le statut de connexion de la victime pour envoyer des requêtes malveillantes au site Web cible à l'insu de la victime. Un attaquant peut obtenir le statut de connexion de la victime par diverses méthodes, puis lancer une fausse requête vers le site Web cible sans se faire remarquer, menant ainsi l'attaque. L'attaquant peut inciter la victime à effectuer des opérations en lui permettant de visiter un site Web tiers, via des liens dans des e-mails ou dans un logiciel de chat, ou en publiant des liens sur les réseaux sociaux, déclenchant ainsi l'attaque.

Dans l'exemple suivant, un attaquant peut laisser la victime visiter un site Web malveillant, générer une requête POST, la déguiser en demande du site Web cible et obtenir l'autorisation de la victime lorsqu'elle est connectée, c'est-à-dire soumettre un commentaire :

<form action="https://www.targetwebsite.com/comment" method="post">
<input type="hidden" name="comment" value="harmful comment" />
<input type="submit" value="Submit Comment" />
</form>
<script>
document.forms[0].submit();
</script>

Cette attaque La méthode est très secrète, car l'attaquant n'attaque pas directement le site Web cible, mais exploite les vulnérabilités du site Web cible pour réaliser l'attaque. La victime l’ignorant, il est difficile de détecter l’attaque. Si le site Web cible ne parvient pas à empêcher les attaques CSRF, cela peut entraîner des fuites de données, des opérations malveillantes et d'autres risques.

2. Comment se défendre contre le CSRF ?

Puisque les attaques CSRF sont si dangereuses, comment se défendre contre elles ? Voici quelques stratégies de défense courantes :

1. Ajouter une vérification du jeton

Lorsque l'utilisateur se connecte, le serveur backend génère un jeton et le renvoie au front-end, et enregistre le jeton sur le serveur lors des interactions ultérieures avec. le serveur, le front-end doit apporter le jeton au serveur avec la demande. Le serveur peut déterminer si la demande est légitime grâce à la vérification du jeton.

Voici un exemple de code simple :

<!-- 后端代码 -->
<?php
session_start();
if(!isset($_SESSION['token'])){
$_SESSION['token'] = md5(uniqid(rand(), true));
}
$token = $_SESSION['token'];
?>

<!-- 前端代码 -->
<form method="post" action="/some/url">
<?php echo "<input type='hidden' name='token' value='".$token."' />"; ?>
<input type="text" name="username" />
<input type="text" name="password" />
<input type="submit" value="Submit" />
</form>

Dans cet exemple, nous générons un jeton aléatoire en arrière-plan et le renvoyons au frontend. Ensuite, le jeton est ajouté à la balise d'entrée masquée. Lorsque le frontal soumet une demande, le jeton sera également soumis et le code sur le serveur vérifiera si la demande est légale sur la base du jeton soumis.

2. Ajouter une vérification de référent

Referer fait partie de l'en-tête HTTP, qui contient la page à partir de laquelle l'utilisateur a été redirigé vers la page actuelle. En vérifiant le Referer dans l'en-tête HTTP, le serveur peut déterminer si la requête provient d'une page légitime. Si le Referer est détecté comme incorrect, le serveur refusera de répondre à la demande.

Voici un exemple de code simple :

<?php
$referer = $_SERVER['HTTP_REFERER'];
if(parse_url($referer, PHP_URL_HOST) != 'www.validwebsite.com') {
die("Invalid Referer");
}
// 处理正常的请求
?>

Dans cet exemple, nous récupérons le Referer dans l'en-tête HTTP et vérifions si la requête provient d'un site Web nommé "www.validwebsite.com". Si la demande ne provient pas de ce site Web, le serveur rejettera la réponse et affichera un message « Référent invalide ».

3. Ajouter des cookies de navigateur

L'attaque CSRF basée sur les cookies est une méthode d'attaque qui utilise le statut de connexion de l'utilisateur et envoie le cookie de l'utilisateur au site Web de l'attaquant. Nous pouvons le faire en définissant un cookie de courte durée pour une page sensible, puis en vérifiant l'existence du cookie lors de l'exécution d'actions liées à cette page.

Voici un exemple de code simple :

header('Set-Cookie: csrf_cookie=' . uniqid(rand(), true) . '; path=/; HttpOnly');

Dans cet exemple, nous générons un csrf_cookie aléatoire et le définissons sur HttpOnly, ce qui signifie que le cookie ne peut être transmis que via le protocole HTTP et n'est pas accessible via JavaScript. Lorsque la requête atteint le serveur, nous pouvons vérifier si son cookie correspond à cette page, identifiant ainsi une éventuelle attaque.

Résumé

L'attaque CSRF est une méthode d'attaque très dangereuse. Se défendre contre les attaques CSRF contribue non seulement à protéger la sécurité des données, mais constitue également une condition de base pour la mise en œuvre d'une programmation sécurisée. Dans l'environnement de développement PHP, nous pouvons prendre certaines mesures pour empêcher les attaques CSRF, telles que la configuration de la vérification des jetons, la vérification des référents, l'ajout de cookies du navigateur, etc. Grâce à ces mesures, nous pouvons protéger efficacement les états de connexion des utilisateurs et les pages contenant des données sensibles contre les attaques.

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