J'aimerais avoir vos avis quant à la sécurité de cette requête et de savoir si je l'ai correctement réalisé ou il y a il une autre méthode afin de ne pas subir d'injontion.
Merci pour votre aide
<?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.";
}
}
?>
pas de besoin de stripslashes, les magic_quotes n'existent plus
n'échappe pas le mot de passe, tu ne l'utilises pas [tel quel] et tu risquerais d'introduire des échappements avant le hachage
tu devrais préparer tes requêtes plutôt que tout échapper toi-même où tout oubli te vaudrait une injection SQL
pourquoi stocker le nom de l'utilisateur en session ? S'il y a UNE donnée à y mettre c'est bien la valeur de ta clé primaire (l'id) (dont tu as sans doute besoin pour tes foreign keys)
pourquoi faire un SELECT * si tu ne réutilises aucune de ses données ? De plus tu réutilises directement le nom issu du formulaire à celui de la requête
on ne se contente jamais de juste hacher, tu dois au moins saler le mot de passe : pourquoi tu n'utilises pas la fonction password_hash ?
éviter $_REQUEST, qui prend les données de plusieurs origines, si ça vient d'un formulaire en POST, utilise directement $_POST. L'usage de $_REQUEST fait un peu "je ne sais pas d'où viennent mes données"
tu ne testes pas l'existence préalable de la variable $_REQUEST['password']/$_POST['password']
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli