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

Langage PHP Discussion :

Sécurité sur requête


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur des opérations & Innovation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 998
    Par défaut Sécurité sur requête
    Bonjour,

    Dans ma page "login", j'ai la requête suivante et je souhaiterais avoir vos avis quant à son écriture et surtout de savoir si la sécurité de ma requête est suffisante pou pas.

    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
    21
    <?php
    require('../connexion/config.php');
     
    session_start();
    if (isset($_POST['username'])){
      $username = stripslashes($_REQUEST['username']);
      $username = mysqli_real_escape_string($conn, $username);
      $password = stripslashes($_REQUEST['password']);
      $password = mysqli_real_escape_string($conn, $password);
        $query = "SELECT * FROM `users` WHERE email='$username' and password='".hash('sha256', $password)."'";
      $result = mysqli_query($conn,$query) ;
      $rows = mysqli_num_rows($result);
      if($rows == 1){
          $_SESSION['username'] = $username;
          header("Location: ../extranet.php");
          exit();
      }else{
        $message = "Le nom d'utilisateur ou le mot de passe est incorrect.";
      }
    }
    ?>
    Venant du monde de Windev, j'ai lu beaucoup d'articles sur la sécurité des requêtes et en outre de se protéger contre les injonctions sql, mais j'avoue avoir encore un peu de mal sur le sujet.
    Par avance merci pour vos remarques
    J'ai lu quelque part que les paramètres devaient être passés avec des "?" mais dans le cas présent, je ne vois pas commet faire
    Raptor92
    Dominique
    Aucune aide par MP, utilisez le forum.

    Mon guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java


  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 373
    Par défaut
    Bonjour, effectivement utiliser des requêtes préparées et paramétrées c'est le mieux. Cette méthode est plus facile, plus claire et surtout plus sécurisée pour effectuer des requêtes.
    Voici la doc php qui en traite , juste besoin d'appliquer à ton cas et pof

    https://www.php.net/manual/fr/mysqli...statements.php


    Bon courage

  3. #3
    Membre éprouvé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur des opérations & Innovation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 998
    Par défaut
    Bonjour,

    Merci pour votre réponse, mais cela ne me renseigne pas sur mon code et de savoir si celui-ci est correct ou pas en terme de sécurité.
    Bonne journée
    Raptor92
    Dominique
    Aucune aide par MP, utilisez le forum.

    Mon guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java


  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 373
    Par défaut
    J'ai pas de citation mais un code n'est jamais parfait donc y a toujours mieux à faire , la question est de savoir si ça en vaut la peine ou pas.

    Bien que mysqli_real_escape_string() aide à prévenir les injections SQL, ce n'est pas une solution complète. Il est recommandé d'utiliser des requête préparé pour être sur que les données sont correctement échappées.

    Utilise password_hash plutot que hash , hash est utilisé pour d'autre donnée mais pas pour le password, password_hash utilise un sel automatique et fait des bidouilles pour rendre ton mdp plus dur à trouver, de plus la fonction utilise le hash bcrypt qui est concu pour être plus long à décrypter ... Bref c'est mieux et puis y a password_verify() normalement pour vérifier le password

    Une discussion qui évoque l'avantage de bcrypt
    https://security.stackexchange.com/q...crypt-vs-sha-3


    Explication de password_hash et password_verify
    https://stackoverflow.com/questions/...assword-verify

    Bref bon courage

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 529
    Par défaut
    Bonjour,

    Pour la securité de la requête c'est ok puisque tu utilises mysqli_real_escape_string, mais du côté érgonomie, il faudrait mieux passer à PDO et oublier MySQLI parce que les caractères spéciaux sont un vrai cauchemar pour MySQLI.

    As-tu essayé de ajouter/récupérer des lignes contenant des caractères spéciaux dans vos tables SQL ?

  6. #6
    Membre éprouvé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur des opérations & Innovation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 998
    Par défaut
    Bonjour,

    Navré pour le délais de réponse, mais il a fallu que cela monte au cerveau et redescende.....
    J'ai donc tenu compte de vos remarques et serais très intéressé par vos remarques.

    Index:

    Code html : 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
    21
    22
    23
    24
    25
    26
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Inscription/Connexion</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
     
        <form method="POST" action="register.php">
            <input type="email" placeholder="Email" name="email"><br>
            <input type="password" placeholder="Mot de passe" name="password"><br>
            <button type="submit">Inscription</button>
        </form>
     
        <hr>
     
        <form method="POST" action="login1.php">
            <input type="email" placeholder="Email" name="email"><br>
            <input type="password" placeholder="Mot de passe" name="password"><br>
            <button type="submit">Connexion</button>
        </form>
     
    </body>
    </html>

    Register:

    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
    <?php
    	require('./connexion.php');
     
    	if (!empty($_POST['email']) && !empty($_POST['password'])) {
    	    $email = $_POST['email'];
    	    $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
     
    	    $q = $conn->prepare('INSERT INTO users (email, password) VALUES (:email, :password)');
    	    $q->bindValue('email', $email);
    	    $q->bindValue('password', $password);
    	    $res = $q->execute();
     
    	    if ($res) {
    	        $message =  "Connexion success";
    	    }
    	}
    Et login:

    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
    21
    <?php
    	require('./connexion.php');
     
    	if (!empty($_POST['email']) && !empty($_POST['password'])) {
    	    $email = $_POST['email'];
    	    $password = $_POST['password'];
    	    $q = $conn->prepare('SELECT * FROM users WHERE email = :email');
    	    $q->bindValue('email', $email);
    	    $q->execute();
    	    $res = $q->fetch(PDO::FETCH_ASSOC);
    	    if ($res) {
    	        $passwordHash = $res['password'];
    	        if (password_verify($password, $passwordHash)) {
    	            $message =  "Connexion success !";
    	        } else {
    	            $message =  "ID or Password failed";
    	        }
    	    } else {
    	        $message =  "ID or Password failed";
    	    }
    	}
    Par avance merci pour votre temps
    Raptor92
    Dominique
    Aucune aide par MP, utilisez le forum.

    Mon guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java


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

Discussions similaires

  1. [AC-2007] Besoin d'aide sur une rêqute sur "Like" et la Date
    Par Jiben59 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/01/2018, 15h29
  2. probleme soustraction sur une requte sql
    Par kroma23 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/06/2011, 13h27
  3. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  4. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 15h28

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