| auteur :berceker united |
Bien souvent les scripts ne contrôle pas la provenance des requêtes http. C'est à dire qu'une personne peut de chez lui faire un script qui qui envoie des requêtes post vers un serveur. Imaginons que cette personne fait une boucle JavaScript qui envoie des requêtes sur un serveur. C'est pourquoi il est préférable de n'accepter que les requetes provenant de votre serveur. Le referer n'est pas une garantie étant donné qu'il est envoyé par le navigateur et peut être supprimé ou modifié.
Le plus simple étant de placer en bas de chaque fichier ceci.
$_SESSION['from'] = $_SERVER['SCRIPT_NAME']; |
et dans la page qui va receptionner les variables post ou get on ajoutera:
session_start();
//Il faut montrer patte blanche
if($_SERVER['REQUEST_METHOD']=='POST' && $_SESSION['from']== '/pages/fichier1.php'){
...
}
header('Location:http://www.monsite.com/valider.php'); |
Pour que ça marche mieux il est préférable de séparer le fichier du formulaire et le fichier de traitement.
|
| auteur :berceker united |
Il y a un risque non négligeable lorsqu'il y a contacte directe avec la base de données via une requete quand cette derniere est généré avec les données du post. Exemple :
"SELECT * FROM utilisateur WHERE login = '".$_POST['login']."' AND password='".$_POST['password']."'; |
Même s'il y a des fonctions permettant d'échaper les caractères spéciaux ceci ne garantie pas complétement au vu de divers article publiés sur ce sujet.
La solution consiste à ne pas demander à la base de données de contrôler le logine et mot de passe envoyé.
On sélectionne tous le contenu de la table contenant les informations de login. | $req = "SELECT login, password,idutilisateur FROM utilisateur";
$rs = mysql_unbuffered_query($req,$rssConn); |
On transfère le résultat dans un tableau | while($data = mysql_fetch_row($rs)){
$arrOut['login'][$i] = $data[0]; //login
$arrOut['password'][$i] = $data[1]; //password
$arrOut['id'][$i] = $data[2];//idutilisateur
$i++;
}
mysql_free_result($rs); //on libère le recordset de la memoire |
On compare avec ce qu'il y a dans le tableau de resultat. | for($i=0;$i<count($arrOut);$i++){
if($arrOut['login'][$i] == $_POST['login'] && $arrOut['password'][$i] == $_POST['password']){
$isIdentifie = true;
$idUtilisateur = $arrOut['id'][$i];//Récupère l'id de l'utilisateur identifié
}
} |
Selon le succès ou l'échec de l'authentification, on renvoie vers une page ou l'autre. | if($isIdentifie===true){
$_SESSION['idutilisateur'] = $idUtilisateur;
header('Location:jesuisidentifie.php');
exit();
}else{
header('Location:erreur.php');
exit();
}
mysql_close($rssConn);
?> |
De cette manière il y a aucun contact direct avec la base de données, une attaque sur la requête ne peut donc aboutir.
Néanmoins, si la table contient une grande quantité d'enregistrements, le coût de l'opération peut devenir important. Chacun jugera si le jeu en vaut la chandelle en fonction de son contexte.
|
Consultez les autres F.A.Q's
|
|