IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Nombre d'essais d'authentification php


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de sihammaster
    Webmaster
    Inscrit en
    Mai 2009
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Webmaster
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 256
    Par défaut Nombre d'essais d'authentification php
    Bonjour,
    Je voudrais rajouter un traitement qui bloque l’accès à un utilisateur au bout de la n eme tentative d'authentification, ou bien une alerte après le dépassement du nombre d'essai d'authentification d'un user.

    Je vous demande comment puis-je modifier mon code pour qu'il prend cette méthode?

    Voila mon code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    if (isset($_POST['login']) && isset($_POST['password'])){
    $Requete=  " select compte.Login AS login,compte.Password AS password,contact.NomContact AS nomcontact,contact.PrenomContact AS PrenomContact,contact.TitreUser AS titreuser,user.NomUser AS nomuser,user.PrénomUser AS prénomuser,statut.NomStatut AS nomstatut,profil.NomProfil AS nomprofil,compte.IdCompte AS idcompte from ((((contact join compte) join user) join statut) join profil) where ((compte.RefContact = contact.IdContact) and (contact.RefStatut = statut.IdStatut) and (contact.RefUser = user.IdUser) and (user.RefProfil = profil.IdProfil) and (compte.IsActif = 1)) and login = '$myusername' AND password = '$mypassword'";
    $result = @mysql_query($Requete); // or die(mysql_error()); 
    // retourne le nombre d'enregistrements dans la table ( ligne )
    $lignes = mysql_num_rows($result);
    if ($lignes<1){
    $_SESSION['login'] =NULL;
    $_SESSION['password'] =NULL;
    $_SESSION['nomuser']=NULL;
    $_SESSION['prenomuser']=NULL;
     		}
     		else
     		{
    $_SESSION['login'] = $_POST['login']; 
    $_SESSION['password'] = $_POST['password']; 
    $_SESSION['nomuser'] = @mysql_result($result,0,"nomuser"); 
    $_SESSION['prenomuser'] = @mysql_result($result,0,"prénomuser"); 
     
      		}
    				}
    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Heu y'a déjà 3 gros problèmes avec ton code:
    1. tu utilise @
    2. tu es vulnérable à une injection SQL
    3. tu dépends de num_rows au lieu d'utiliser COUNT


    Corrige déjà ça et après on fera throtling après

  3. #3
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 494
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 494
    Par défaut
    SAlut,

    dans ton if(){ , tu peux ajouter une variable de session que tu incrementes.
    au dela de X essais tu affiche ton message

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //au debut du fichier (apres le session_start() quand meme)
    if(!isset($_SESSION["tentative"])) {
    $_SESSION["tentative"] = 0;
    }
    if($_SESSION["tentative"] > 3) {
    exit('trop de tentatives');
    }
    //...ton code
    if ($lignes<1){
    $_SESSION['login'] =NULL;
    $_SESSION['password'] =NULL;
    $_SESSION['nomuser']=NULL;
    $_SESSION['prenomuser']=NULL;
    $_SESSION["tentative"]++;
    }
    //...le reste
    j'ai pas teste.. mais tu as la grande ligne de comment j'aurai fait...
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Je doute qu'une attaque par brute force te renvoie le token de session, je ne pense pas que ce soit une bonne façon de sécuriser le formulaire de login. Mieux vaux enregistrer le nombre d'essai pour l'IP en cours dans un fichier qui sera détruit une fois la connexion établie.

  5. #5
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 494
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 494
    Par défaut
    oui, mon code est brut de decoffrage, pas securise rien... mais j'ai pas envis de faire son code... je lui donne la methode que j'aurai suivi, a lui de l'adapter

    bien sur, il faut tester l'ip, le temps, le md5 du navigateur, la session, les cookies, etc... mais chaque chose en son temps non ?

    si deja il arrive a afficher un message au bout de X tentative, on pourra pousser la securite et faire d'autres tests...

    je voyais cette discution par etape... si on lui balance tout d'un coup, il risque d'etre un peu perdu :/
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Moi j'étais parti pour l'étape 1: sécuriser le code. La faille de sécurité dans sa requête SQL est préoccupante.

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    vulnérable à une injection SQL
    Hum dit moi Benjamin, c'est quoi le problème exactement ( c'est juste parce qu'il utillise pas PDO , ou bien c'est dans la requête elle même ? )

    Bon c'est vrai aussi que l'on ne sait pas ce qu'il fait de la variable entre $_POST['login'] et $myusername

  8. #8
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    Comme te l'a dit Benjamin, tu dois échapper les données avant de le présenter à la base de données.
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "login = '".mysql_real_escape_string($myusername)."' AND password = '".mysql_real_escape_string($mypassword)."'"

  9. #9
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Soit dit en passant, PDO n'est pas la solution magique pour sécuriser les accès à la base, on peut y parvenir quel que soit l'extension utilisée mais c'est vrai que j'ai un faible pour les requêtes préparées de PDO et de MySQLi.

    Deuxième problème: enlève tout de suite toutes les occurence de @. L'arobase à pour effet de désactiver le reporting d'erreur pour tout ce qui suit ce qui pose deux soucis:
    1. on ne sait plus ou sont les erreurs
    2. ça ralentis les scripts

    Pour finir de te convaincre: http://www.php.net/manual/fr/languag...rorcontrol.php
    Si tu veux gêrer correctement tes erreurs, vérifie systématiquement tes retours de fonctions.

    Troisième problème (mineur): Tu aurais meilleur compte en terme de performances et de portabilité d'utiliser une requête SELECT COUNT(*) sur ta requête de login et de n'effectuer la récupération des informations de l'utilisateur que si ce COUNT est positif.

  10. #10
    Membre éclairé Avatar de sihammaster
    Webmaster
    Inscrit en
    Mai 2009
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Webmaster
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 256
    Par défaut
    Merci ca marche nickel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. nombre limité d'essais d'authentification !
    Par anajosefana dans le forum Langage
    Réponses: 4
    Dernier message: 17/04/2008, 02h29
  2. [Sécurité] Pb authentification PHP
    Par bodybody22000 dans le forum Langage
    Réponses: 4
    Dernier message: 09/06/2006, 09h28
  3. Compter le nombre d'essais de login
    Par jsl1 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 28/04/2006, 17h17
  4. Script page administration et authentification Php
    Par mastercartman dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 11/03/2006, 17h34
  5. [XML] [cURL] Authentification Php récupération de données
    Par thibaut06 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 13/02/2006, 14h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo