Je suis nouveau à PDO et je suis un peu perdu dans les fonctions et comment les faire fonctionner correctement!Connexion à l'aide de PDO et SHA1
J'ai déjà créé les fonctions pour insérer de nouveaux utilisateurs et maintenant, j'essaye de faire la fonction de connexion.
Je Crypted mon mot de passe avec ceci:
function create_salt($username,$timestamp)
{
$hashed = sha1($username.$timestamp) ;
$randomized = '';
for ($i = 0 ; $i <= 40 ; $i++)
{
$randomChar = $hashed[rand(0, strlen($hashed)-1)];
$randomized.=$randomChar;
}
return $randomized;
}
et pour l'insertion de l'utilisateur:
function userRegister($password,$email,$role,$title,$first_name,$last_name,$phone,$mobile_phone,$address,
$postal_code,$postal_case,$city,$country,$agent_number)
{
// generate username
$username = createUsername($first_name,$last_name,$email);
// create salt
$password_salt = create_salt($username,time());
// encrypt password
$cryptedPassword = sha1($password);
// create new pdo object
$pdo = dbConnect();
try
{
$pdo->beginTransaction();
// create the account, allowing the user to log in
$req = $pdo->prepare("INSERT INTO t_accounts (a_creation,a_last_change,a_username,a_password,a_password_salt,a_email)
VALUES (NOW(),NOW(),:username,:cryptedPassword,:password_salt,:email)");
$req->execute(array(
'username' => $username,
'cryptedPassword' => $cryptedPassword,
'password_salt' => $password_salt,
'email' => $email
));
echo 'Account added';
$lastAccountID = $pdo->lastInsertId();
// create the user
$req2 = $pdo->prepare("INSERT INTO t_users (t_roles_role_id,t_accounts_account_id,u_creation,u_last_change,
u_title,u_first_name,u_last_name,u_phone,u_mobile_phone,u_address,u_postal_code,
u_postal_case,u_city,u_country,u_agent_number)
VALUES (:role,LAST_INSERT_ID(),NOW(),NOW(),:title,:first_name,:last_name,:phone,
:mobile_phone,:address,:postal_code,:postal_case,:city,:country,:agent_number)");
$req2->execute(array(
'role' => $role,
'title' => $title,
'first_name' => $first_name,
'last_name' => $last_name,
'phone' => $phone,
'mobile_phone' => $mobile_phone,
'address' => $address,
'postal_code' => $postal_code,
'postal_case' => $postal_case,
'city' => $city,
'country' => $country,
'agent_number' => $agent_number
));
echo 'User added';
$lastUserID = $pdo->lastInsertId();
// open the logs for this account
$req3 = $pdo->prepare("INSERT INTO t_accounts_logs (al_date,al_ipv4,al_ipv6,al_description,al_username)
VALUES (NOW(),:al_ipv4,:al_ipv6,:al_description,:al_username)");
$req3->execute(array(
'al_ipv4' => $_SERVER['REMOTE_ADDR'],
'al_ipv6' => '',
'al_description' => 'Création du user '.$lastUserID.'/'.$first_name.' '.$last_name.' avec le compte '.$lastAccountID.'/'.$username,
'al_username' => $username
));
echo 'Log added';
$pdo->commit();
echo 'tout s\'est bien passé.';
}
catch(Exception $e)
{
// rollback the transaction
$pdo->rollback();
// display error message and datas
echo 'Tout ne s\'est pas bien passé, voir les erreurs ci-dessous<br />';
echo 'Erreur : '.$e->getMessage().'<br />';
echo 'N° : '.$e->getCode();
// exit the catch to avoid the next errors
exit();
}
}
et tout fonctionne très bien. Maintenant, j'essaye de faire la fonction de connexion et j'ai besoin de vérifier si le nom d'utilisateur, l'email et le mot de passe sont bons.
Où je suis:
function loginUser($fusername,$fpassword,$femail)
{
$pdo = dbConnect();
$encryptedPassword = sha1($fpassword);
// create the account, allowing the user to log in
try
{
$req = $pdo->prepare("SELECT a_username, a_password, a_password_salt,a_email
FROM t_accounts WHERE t_accounts.a_username = :username
AND t_accounts.a_email = :email
AND t_accounts.a_password = :password;");
$req->execute(array(
":username" => $fusername,
":email" => $femail,
":password" => $encryptedPassword
));
if ($req->rowCount() == 1)
{
while ($get = $req->fetch(PDO::FETCH_OBJ))
{
echo 'logged in';
}
}
else
{
echo 'user does not exist';
}
}
catch (Exception $e)
{
echo "could not retrieve data from database" ;
}
}
Je cherchais un certain tutoriel comme celui-ci: https://x10hosting.com/community/threads/question-log-in-pages-with-pdo.192294/#post-923672 mais il ne teste le mot de passe avec le sel.
Que devrais-je changer dans le test si j'ai aussi besoin de vérifier le sel et si la fonction est bonne?
Pour l'amour de Dieu, s'il vous plaît utilisez [ 'password_hash'] (http: //php.net/password_hash). – deceze
@deceze: I userd $ timestamp = time(); $ password = 'mot de passe'; $ options = [ 'cost' => 11, 'salt' => créer_salt ($ nom d'utilisateur, heure()) ]; $ Hash = password_hash ($ mot de passe, PASSWORD_BCRYPT, $ options); Est-ce que c'est ce que vous voulez que j'utilise maintenant? – Anaon
Ne créez pas de sel manuellement avec 'password_hash'. Lisez toute la page de manuel. Alors peut-être en lire un peu plus ici: https://wiki.php.net/rfc/password_hash – deceze