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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Correction - Page de connexion


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre à l'essai Avatar de v4lUs
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Correction - Page de connexion
    Salut, je voudrais savoir mon travail est correct, notamment en terme de sécurité

    Mit à jour le 12/06/2019 à 10:10

    L'index :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?php
     
    //SESSION
    session_start();
    if (isset($_SESSION['name'])) {
    	header('Location: ok.php');
    	exit();
    }
     
    ?>
     
    <!DOCTYPEhtml>
     
    <html>
     
    	<head>
    		<meta charset="utf-8" />
    		<link rel="stylesheet" href="index.css" />
    		<title>fict.io - Connexion</title>
    	</head>
     
    	<body>
     
    		<h1>CONNEXION</h1>
     
    		<form id="connect_form" method="post" action="wrks/connect.php">
     
    			<div>
    				<label for="login">Utilisateur</label>
    				<input type="text" name="login" autofocus required />
    			</div>
     
    			<div>
    				<label for="password">Mot de passe</label>
    				<input type="password" name="password" pattern="(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$" required />
    			</div>
     
    			<input type="submit" value="Connexion" />
     
    		</form>
     
    		<h1>INSCRIPTION</h1>
     
    		<form id="subscribe_form" method="post" action="wrks/subscribe.php">
     
    			<div>
    				<label for="login">Utilisateur</label>
    				<input type="text" name="login" required />
    			</div>
     
    			<div>
    				<label for="password">Mot de passe</label>
    				<input type="password" name="password" pattern="(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$" required />
    			</div>
     
    			<div>
    				<label for="confirm_password">Confirmer le mot de passe</label>
    				<input type="password" name="confirm_password" pattern="(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$" required />
    			</div>
     
    			<div>
    				<label for="not_a_robot">17 + 25 (A écrire en toutes lettres)</label>
    				<input type="text" name="not_a_robot" required />
    			</div>
     
    			<input type="submit" value="Inscription" />
     
    		</form>
     
    	</body>
     
    </html>
    La page d'inscription :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <?php
     
    //Démarrage de la session
    session_start();
     
    //Connexion à la BDD
    $bdd = new PDO('mysql:host=localhost;
    				dbname=fict_io;
    				charset=utf8',
    				'user',
    				'',
    				array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ));
     
    //Préparation de la commande
    $prep = $bdd->prepare('INSERT INTO accounts(username,
    											password,
    											level)   VALUES(?, ?, 0)' );
     
    //Vérification de l'entrée spam
    if (!isset($_POST['not_a_robot'])) { 
     
    	//Redirection_ERROR
    	//header('Location: ../index.php');
     
    } else {
     
    	//Vérification de la clé spam
    	if (md5($_POST['not_a_robot']) !== 'be2afdf0c7b6beabf937fc1672a920c7') { 
     
    		//Redirection_ERROR
    		//header('Location: ../index.php');
     
    	} else {
     
    		//Récupération des informations
    		$login = $_POST['login'];
    		$password = $_POST['password'];
    		$confirm = $_POST['confirm_password'];
    		$hashed_pass = password_hash($password, PASSWORD_ARGON2ID);
     
    		//Préparation des paramètres
    		$prep->bindParam(1, $login);
    		$prep->bindParam(2, $hashed_pass);
     
    		//Vérification du mot de passe
    		if ($password !== $confirm) {
     
    			//Redirection_ERROR
    			//header('Location: ../index.php');
     
    		} else {
     
    			//Vérification de la disponibilité du pseudonyme
    			$user_fetch = $bdd->query('SELECT * FROM accounts');
    			while ($user = $user_fetch->fetch()) {
    				if ($login === $user['username']) {
     
    					//Redirection_ERROR
    					header('Location: ../index.php');
    				}
    			}
     
    			//Ecriture de l'entrée BDD
    			$prep->execute();
     
    			//Redirection_OK
    			//header ('Location: ../index.php');
    		}
    	}
    }
    La page de connexion :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    <?php
     
    //debug
    $error_token = array();
     
    //Connexion à la BDD
    $bdd = new PDO('mysql:host=localhost;
    				dbname=fict_io;
    				charset=utf8',
    				'user',
    				'',
    				array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ));
     
    //Récupération des informations
    $login = $_POST['login'];
    $password = $_POST['password'];
     
    //Récupération des noms des comptes
    $users = $bdd->query('SELECT username FROM accounts');
    $usernames = array ();
    while ($user = $users->fetch()) {
    	array_push($usernames, $user['username']);
    }
     
    //Vérification de l'éxistance du comptes
    if (!in_array($login, $usernames)) {
     
    	//Redirection_ERROR - WRONG_NAME
    	//header('Location: ../index.php');
     
    } else {
     
    	//Vérification du mot de passe
    	$pass = $bdd->query("SELECT password FROM accounts WHERE username='{$login}'");
    	while ($pw = $pass->fetch()) {
    		if (!password_verify($password, $pw['password']))
    		{
     
    			//Redirection_ERROR - WRONG_PASS
    			header('Location: ../index.php');
     
    		} else {
     
    			//Récupération des informations de la session
    			session_start();
    			$_SESSION['name'] = $login;
     
    			//Redirection_OK
    			header('Location: ../index.php');
     
    		}
    	}
     
    }
    La page sécurisée :
    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
    <?php
     
    session_start();
    session_destroy();
     
    ?>
     
    <html>
     
    	<head>
    		<meta charset="utf-8" />
    	</head>
     
    	<body>
    		<p>OK</p>
    		<a href="index.php">RETOUR</a>
    	</body>
     
    </html>
    Voilà le pavé
    Pour ceux qui voudraient les fichiers :
    fict_io.rar

    Voilà, un grand merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    y a plusieurs points à revoir :
    - md5() ne doit plus être utilisé, cette fonction a été compromise un paquet de fois (collisions)
    - tu dois factoriser la connexion à ta base de données
    - tu ne dois surtout pas utiliser htmlspecialchars() pour échapper les données à persister
    - tu dois utiliser le mécanisme de sécurisation des données fourni en natif par PDO (PDOStatement)

    Euh, c'est quoi ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    session_start();
    session_destroy();
    T'as bu ???
    Je pense que tu peux tout reprendre

  3. #3
    Membre à l'essai Avatar de v4lUs
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Je pense que tu peux tout reprendre
    Super, mais j'y connais rien de plus que ça x)

    - password_hash() pour remplacer md5(), donc ?
    - Ça veut dire quoi, "factoriser la connexion à la BDD" ?
    - Donc htmlspecialchars ne sert à rien ?
    - Connais pas PDOStatement, vais regarder de la doc, en espérant que ça soit lisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    session_start();
    session_destroy();
    Juste pour détruire la session, et réitérer le test si besoin...

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    password_hash() c'est parfait

    Factoriser que ça soit en math ou en n'importe quoi veut dire juste que tu sors le bout de code de manière à qu'il ne soit pas dupliqué et tu l'injectes là où tu en as besoin.

    htmlspecialchars() ne sert qu'a échapper les caractères dangereux à l'affichage dans le navigateur (C'est vital pour la survie de ton site)

    PDOStatement c'est l'objet que tu récupère une fois que t'a préparé ta requête via $stmt = $pdo->prepare($sql);

  5. #5
    Membre à l'essai Avatar de v4lUs
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Factoriser que ça soit en math ou en n'importe quoi veut dire juste que tu sors le bout de code de manière à qu'il ne soit pas dupliqué et tu l'injectes là où tu en as besoin.
    Ca revient à préparer ma requête non ?
    PS : J'ai modifié les fichiers, je met à jour le premier message.

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    ce que je veux te dire c'est le code de connexion à la base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //Connexion à la BDD
    $bdd = new PDO('mysql:host=localhost;
    				dbname=fict_io;
    				charset=utf8',
    				'user',
    				'',
    				array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ));
    tu dois le sortir dans un fichier séparé afin qu'en cas de modification par exemple du mot de passe de connexion, tu ne sois pas obligé de ta palucher tous les fichiers.
    Comme il n'est pas nécessaire d'ouvrir autant de connexions que de scripts tu peux aussi voir à le gérer de manière différente : regarde ce tuto : PDO une soupe et au lit, la partie connexion fournie par mes soins.

  7. #7
    Membre à l'essai Avatar de v4lUs
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Je vais regarder tout ça, Merci pour tes réponses

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

Discussions similaires

  1. Page de connexion en GWT
    Par Stouille89 dans le forum GWT et Vaadin
    Réponses: 9
    Dernier message: 22/07/2009, 20h58
  2. [phpMyAdmin] Changer le titre de la page de connexion
    Par stanley dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 16/10/2007, 14h54
  3. Retour à la même page après connexion
    Par bruburque dans le forum Langage
    Réponses: 6
    Dernier message: 30/06/2007, 16h38
  4. administrateur page de connexion
    Par kitty2006 dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2006, 22h03
  5. Comment retourner à sa page apres connexion?
    Par feti2004 dans le forum Langage
    Réponses: 5
    Dernier message: 03/04/2006, 09h46

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