mon fichier de traitement de connexion est il suffisamment protégé

Mammouth du PHP | 506 Messages

25 mai 2021, 11:36

bonjour a tous
a présent que mon site fonctionne
je souhaite en améliorer la sécurité

et donc je souhaiterais savoir si mon fichier du traitement de ma connexion est suffisamment protégé

merci de votre avis

Code : Tout sélectionner

<?php session_start(); ?> <?php require_once 'config.php'; if (!empty($_POST['pseudo']) && !empty($_POST['email']) && !empty($_POST['password']) && !empty($_POST['password_retype'])) { $pseudo = htmlspecialchars($_POST['pseudo']); $email = htmlspecialchars($_POST['email']); $password = htmlspecialchars($_POST['password']); $password_retype = htmlspecialchars($_POST['password_retype']); $check = $bdd->prepare('SELECT pseudo, email, password FROM utilisateurs WHERE email = ?'); $check->execute(array( $email )); $data = $check->fetch(); $row = $check->rowCount(); if ($row == 0) { if (strlen($pseudo) <= 100) { if (strlen($email) <= 100) { if (filter_var($email, FILTER_VALIDATE_EMAIL)) { if ($password == $password_retype) { $cost = ['cost' => 12]; $password = password_hash($password, PASSWORD_BCRYPT, $cost); $ip = $_SERVER['REMOTE_ADDR']; $insert = $bdd->prepare('INSERT INTO utilisateurs(pseudo, email, password, ip, token) VALUES(:pseudo, :email, :password, :ip, :token)'); $insert->execute(array( 'pseudo' => $pseudo, 'email' => $email, 'password' => $password, 'ip' => $ip, 'token' => bin2hex(openssl_random_pseudo_bytes(24)) )); header('Location:redirection-inscription.php?reg_err=success'); die(); } else { header('Location: inscription.php?reg_err=password'); die(); } } else { header('Location: inscription.php?reg_err=email'); die(); } } else { header('Location: inscription.php?reg_err=email_length'); die(); } } else { header('Location: inscription.php?reg_err=pseudo_length'); die(); } } else { header('Location: inscription.php?reg_err=already'); die(); } }

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

25 mai 2021, 12:42

La règle principale c'est de vérifier/filtrer toutes les données que tu reçois d'un utilisateur pour s'assurer qu'elles soient bien au format attendu.
PHP a une fonction très pratique pour celà filter_var()
https://php.net/filter_var

Et surtout une liste de filtres prédéfinis de validation ou de nettoyage qui sont remarquablement complètes :
https://www.php.net/manual/fr/filter.filters.php

Par exemple pour vérifier qu'un email est un email par exemple tu as FILTER_VALIDATE_EMAIL
Pour tes autres champs s’ils n'ont pas un filtre prédéfini, tu peux utiliser le filtre regex pour lister les caractères autorisés et ainsi limiter les risques.
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 506 Messages

25 mai 2021, 13:00

bonjour @rthur

merci pour la réponse et l explication mais pour l email sauf erreur c est déjà dans mon code
pour ce qui est du pseudo et du password
j ai trouve ce code
mais je dois l inclure ou

Code : Tout sélectionner

// the pseudo must be alphanumeric, // but not *only* numeric, // between 6 and 10 characters long, // and cast it to a string $ok = $filter->validate($pseudo, 'alnum') && ! $filter->validate($pseudo, 'int') && $filter->validate($pseudo, 'strlenBetween', 6, 10) && $filter->sanitize($pseudo, 'string'); if (! $ok) { echo "The pseudo is not valid."; } // the password must be at least 6 characters long, and must match a // confirmation field $ok = $filter->validate($password, 'strlenMin', 6) && $filter->validate($password, 'equalToValue', $password_retype); if (! $ok) { echo "The password is not valid."; }