IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Pour la FAQ
        Comment contrôler l'origine des requête pour éviter les attaques de l'exterieur ?
        Authentification - comment éviter l'utilisation du login saisi dans la requête?

rechercher
precedent    sommaire    suivant    telechargermiroir


Comment contrôler l'origine des requête pour éviter les attaques de l'exterieur ?
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.


Authentification - comment éviter l'utilisation du login saisi dans la requête?
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.


rechercher
precedent    sommaire    suivant    telechargermiroir

Consultez les autres F.A.Q's


Valid XHTML 1.1!Valid CSS!