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

  1. #1
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    975
    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 : 975
    Points : 766
    Points
    766
    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

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

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

    Informations forums :
    Inscription : Juin 2022
    Messages : 145
    Points : 294
    Points
    294
    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 éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    975
    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 : 975
    Points : 766
    Points
    766
    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

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

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

    Informations forums :
    Inscription : Juin 2022
    Messages : 145
    Points : 294
    Points
    294
    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 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 453
    Points : 4 978
    Points
    4 978
    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 éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    975
    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 : 975
    Points : 766
    Points
    766
    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

  7. #7
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 453
    Points : 4 978
    Points
    4 978
    Par défaut
    Bonjour,

    Ceci me semble plus clair mais pas encore vraiment propre, car du côté ergonomique ce n'est pas bon de séléctionner toutes les colonnes avec select *, mais extraire seulement celles dont tu as besoin..., après je pense aussi qu'on peut passer directement un tableau à la méthode execute() qui accepte un seul paramètre de type tableau $res = $q->execute([":email"=>$email,":password"=>$password]); au lieu de bindValue (Notez les deux points avant les noms des marqueurs ...)

  8. #8
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    975
    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 : 975
    Points : 766
    Points
    766
    Par défaut
    Bonjour,
    En effet, je vais voir la différence

    Merci à Tous pour vos commentaires et aide
    Bonne journée

  9. #9
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    975
    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 : 975
    Points : 766
    Points
    766
    Par défaut
    Bonjour,

    J'ai un dernier souci sur cette page, en effet, je cherche à passer le nom de l'identifiant en paramètre afin de l'afficher sur les différentes page du site:

    Page 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <!DOCTYPE html>
    <html>
    <head>
      <link rel="stylesheet" href="../css/stylelogin.css" />
    </head>
     
    <body>
    <?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)) {
                echo("Connexion success !");
                $_POST['email'] = $email;
                header("Location: ../extranet.php");
                exit();
            } else {
                echo("ID or Password failed") ;
            }
        } else {
            echo("ID or Password failed");
        }
    }
        ?>
     
    <form class="box" action="" method="post" name="login">
    <h1 class="box-logo box-title">SIMAG Solutions Digital</h1>
    <h1 class="box-title">Connexion</h1>
    <input type="text" class="box-input" name="email" placeholder="Renseignez votre email">
    <input type="password" class="box-input" name="password" placeholder="Mot de passe">
    <input type="submit" value="Connexion " name="submit" class="box-button">
    <p class="box-register">Vous êtes nouveau ici? <a href="register.php">S'inscrire</a></p>
    <?php if (! empty($message)) { ?>
        <p class="errorMessage"><?php echo $message; ?></p>
    <?php } ?>
    </form>
    </body>
    </html>
    Première page du site (Extranet.php)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    	// Initialiser la session
    	session_start();
    	// Vérifiez si l'utilisateur est connecté, sinon redirigez-le vers la page de connexion
    	if(!isset($_POST["email"])){
    		header("Location: login1.php");
    		exit(); 
    	}
    ?>
     
    <h1>Bienvenue <?php echo $_POST['email']; ?>!</h1>

    Auriez vous une idée svp, je cale
    Merci beaucoup

  10. #10
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 453
    Points : 4 978
    Points
    4 978
    Par défaut
    Bonjour,

    Tu n'as qu'à enregistrer les données de l'utilisateur dans la variable globale $_SESSION pour qu'elles soient accessibles par toutes les pages PHP.

    C'est dans ce bloc que sa se passe :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (password_verify($password, $passwordHash)) {
          echo("Connexion success !");
          $_SESSION["login"]=$res['login'];
          $_SESSION["email"]=$email;
          header("Location: ../extranet.php");
          exit();
    }

    Après pour vérifier que l'utilisateur est connecté ou pas, il faut utiliser la variable $_SESSION["login"] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(!empty($_SESSION["login"])){
    //utilisateur connecté ...
    }
    Un session_start() est obligatoire au début du fichier login.php, sinon l'enregistrement ne fonctionnera pas.

  11. #11
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    975
    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 : 975
    Points : 766
    Points
    766
    Par défaut
    Bonsoir,

    Vraiment merci beaucoup, cela fonctionne parfaitement
    Toujours plaisant d'être sur un site ou le mot "entraide" a encore une réelle signification.

    Sujet résolu

+ 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, 16h29
  2. probleme soustraction sur une requte sql
    Par kroma23 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/06/2011, 14h27
  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, 16h28
  4. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 14h59
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 16h28

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