J'ai posté ma question ici et avant de modifier le post, elle était fermée car pas une vraie question !
J'ai un formulaire de connexion comme celui-ci:
<html>
<head>
<title>Password Checking Script</title>
</head>
<body>
<form action="check_user-pass.php" method="POST">
<h3>Please Login</h3>
User Name: <input type="text" name="user_name"><br>
Password: <input type="password" name="password">
<input type="submit" name="submit" value="Login!">
</form>
</body>
</html>
Comme vous le voyez, ce formulaire authentifie l'utilisateur via check_user-pass.php
.
Il recherche ces informations d'identification sur ma base de données; s'ils existent, renvoie OK
, sinon renvoie la valeur NO
.
Ma question est donc la suivante: quel code dois-je inclure dans check_user-pass.php
?
J'ai essayé d'ajouter plus de code mais je n'ai pas pu le faire aussi! Mon code actuel est:
<?php
ob_start();
$Host=""; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name=""; // Database name
$tbl_name=""; // Table name
// Connect to server and select databse.
mysql_connect("$Host", "$username", "$password") or die(mysql_error());
echo "Connected to MySQL<br />";
mysql_select_db("$db_name") or die(mysql_error());
echo "Connected to Database<br />";
// Check $username and $password
/*
if(empty($_POST['username']))
{
echo "UserName/Password is empty!";
return false;
}
if(empty($_POST['password']))
{
echo "Password is empty!";
return false;
}
*/
// Define $username and $password
$username=$_POST['username'];
$password=md5($_POST['pass']);
// To protect MySQL injection (more detail about MySQL injection)
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $username and $password, table row must be 1 row
if ($count==1) {
echo "Success! $count";
} else {
echo "Unsuccessful! $count";
}
ob_end_flush();
?>
Le nom dans votre formulaire est user_name
mais dans votre script vous recherchez username
$username=$_POST['username'];
devrait être
$username=$_POST['user_name'];
ÉDITER:
Si vous utilisez crypt pour crypter votre mot de passe avant de le mettre dans la base de données, essayez ceci
$sql="SELECT * FROM $tbl_name WHERE username='$username'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $username and $password, table row must be 1 row
if($count==1){
$row = mysql_fetch_assoc($result);
if (crypt($password, $row['password']) == $row['password']){
session_register("username");
session_register("password");
echo "Login Successful";
return true;
}
else {
echo "Wrong Username or Password";
return false;
}
}
else{
echo "Wrong Username or Password";
return false;
}
EDIT: myBB semble utiliser un crapload de hachage md5 pour leurs mots de passe, essayez ceci
$sql="SELECT * FROM $tbl_name WHERE username='$username'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $username and $password, table row must be 1 row
if($count==1){
$row = mysql_fetch_assoc($result);
if (md5(md5($row['salt']).md5($password)) == $row['password']){
session_register("username");
session_register("password");
echo "Login Successful";
return true;
}
else {
echo "Wrong Username or Password";
return false;
}
}
else{
echo "Wrong Username or Password";
return false;
}
Le hachage est également un moyen pour que vous ne puissiez pas récupérer les mots de passe déjà dans la base de données, vous devrez simplement demander aux utilisateurs de modifier/mettre à jour leurs mots de passe.
Si ce qui précède fonctionne, vous n'aurez pas à désactiver le cryptage, et tout devrait bien se passer.
La plupart du temps, les mots de passe dans les bases de données mysql sont cryptés. Si vous les avez saisis directement dans la base de données, ils peuvent ne pas avoir de sel. Essayez de chiffrer le mot de passe avant de le transmettre à la requête:
$crypted_pass = crypt($password);
S'il y a un sel (souvent les deux premières lettres du nom d'utilisateur), passez-le avec la fonction crypt:
$salt = substr($username, 0, 2);
$crypted_pass = crypt($password, $salt);
Essayez quelque chose de simple:
if ($count==1) {
echo "Success! $count";
} else {
echo "Unsuccessful! $count";
}
Cela verra si vous renvoyez quelque chose de plus de 1 ou plusieurs valeurs.