2009-11-23 7 views
19
  1. Exiger l'authentification dans GET et paramètres POST, pas seulement les cookies;empêchant csrf dans php

  2. Vérification de l'en-tête HTTP Referer;

a vu ce post sur wikipedia et je me demandais comment je peux les appliquer

ok ... J'utilise le cadre Kohana PHP et j'ai la possibilité de déterminer l'en-tête referrer, mais qu'est-ce exactement Je vérifie l'en-tête du référent? la fonction framework renvoie uniquement l'URL du référent

et comment puis-je valider les paramètres GET et POST? contre quoi? informations stockées? type attendu?

Répondre

39

Pour empêcher CSRF, vous devez valider un jeton unique POST et associé à la session en cours. Quelque chose comme le suivant. . .

Sur la page où les demandes des utilisateurs pour supprimer un enregistrement:

confirm.php

<?php 
session_start(); 
$token= md5(uniqid()); 
$_SESSION['delete_customer_token']= $token; 
session_write_close(); 
?> 
<html> 
<body> 
<form method="post" action="confirm_save.php"> 
<input type="hidden" name="token" value="<?php echo $token; ?>" /> 
Do you really want to delete? 
<input type="submit" value=" Yes " /> 
<input type="button" value=" No " onclick="history.go(-1);" /> 
</form> 
</body> 
</html> 

Puis, quand il s'agit de supprimer réellement l'enregistrement:

confirm_save.php

<?php 
session_start(); 
$token = $_SESSION['delete_customer_token']; 
unset($_SESSION['delete_customer_token']); 
session_write_close(); 
if ($token && $_POST['token']==$token) { 
    // delete the record 
} else { 
    // log potential CSRF attack. 
} 
?> 

Le jeton devrait être difficile à deviner, unique pour chaque demande de suppression, accepté via $ _POST seulement et expirant après quelques minutes (expiration non montrée dans cet exemple).

+0

L'expiration de la session ne devrait pas être suffisante? Je ne veux pas vérifier l'expiration avec une fonction personnalisée. –

+0

Les sessions n'empêchent pas CSRF @JavierConstanzo. Parfois, ils durent des semaines ou plus.Que se passe-t-il si vous ouvrez un site Web avec une attaque CSRF alors que votre session est toujours active? –

+0

Pourquoi voudriez-vous configurer votre serveur @EdsonMedina pour avoir des sessions qui durent des semaines? Je sais que les séances ne suffisent pas à prévenir la CSRF, ce que je n'impliquais pas. –

3

Avec la vérification de référence, tout ce que vous faites est de vérifier que le référent provient de votre site/système. Si le référenceur n'existe pas ou provient d'un site étranger, la vérification des références échoue et vous ne voulez peut-être pas honorer la requête qui est faite. Par le passé, des problèmes liés à diverses technologies et différents navigateurs (flash..et al) permettaient de falsifier les en-têtes de renvoi. C'est quelque chose à considérer. Il existe plusieurs méthodes utilisant javascript pour lier à des ressources où les données de référence ne sont pas présentes/passées dans l'en-tête de la demande.

Ce comportement varie quelque peu entre les navigateurs. Si vous utilisez javascript pour soumettre un formulaire, c'est généralement OK. Si vous utilisez quelque chose comme window.location, vous ne devriez probablement pas vous attendre à ce que des données de référence soient présentes.

Une méthode populaire pour la prévention CSRF est de ne pas utiliser de cookies et de toujours passer l'état entre les références ... Passer un jeton de session dans tous les liens dans une application.

+1

Très vrai, l'en-tête HTTP Referer peut être facilement falsifié et n'offre aucune protection réelle contre CSRF. – leepowers

2

[Note:] Kohana framework est obsolète, la nouvelle fourchette pour Kohana PHP 7 est https://koseven.ga/ et il supporte la fonctionnalité CSRF est la classe de sécurité.

Vous pouvez utiliser la fonction de sécurité officielle de Koseven. Voici un lien vers koseven security class.

Questions connexes