if (!password_verify($champ[1],$passe1)) continue;
if (!password_verify($_POST['password'], $champ[1])) continue;
// avec fichier de la forme
// login1\thash1\tdate1
// login2\thash2\tdate2
// ...
// et formulaire avec inputs login et password en post
foreach (file('fichieravecIDtabPWhashtabdate.txt') as $line) {
list($login, $passwordHash, $date) = explode("\t", $line);
if ($login == $_POST['login'] && password_verify($_POST['password'], $passwordHash)) {
// connecter l'utilisateur
// ...
break ;
}
}<?php
// Voir l'exemple fourni sur la page de la fonction password_hash()
// pour savoir d'où cela provient.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Le mot de passe est valide !';
} else {
echo 'Le mot de passe est invalide.';
}
une question (peut-être stupide) quand en production il procède la ligne de code:
$passe2= password_hash($_POST["password"], PASSWORD_DEFAULT);
est-ce que, si le PW en clair est bon, le résultat hashé va être identique à celui du fichier txt qui a été généré et figé par exemple 3 semaines plus tôt???
Code : Tout sélectionner
$regex="#$nom2#"; //ligne modifiée de sha1 qui serait alors $regex="#$nom2\t$passe2#";
foreach ($lignes as $lgn)
{
if(preg_match($regex,$lgn,$tab))
{
$champ = preg_split('#\t#',$lgn);
if (!password_verify($_POST['password'], $champ[1])) continue; //ligne absente en sha1
$date = $champ[2];
if($date!== false)
{
$now = new Datetime();
$now = $now->format('Y-m-d');
$next = new DateTime($date);
if( $now < $date )
{
$membre2=1;
$id_mem2=$tab[1];
}
}
}// fin if(preg_match)
}//fin foreach
if ($membre2==1)
{
// identifier comme membre
$_SESSION["MEMBRE"]="oui";
$_SESSION["login"]=$nom2;
$_SESSION["passe"]=$passe2;
header("Location: $members_area");
}
else
{
header("Location: $error");
include "$error";
}
//etc.session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// stocke les données du formulaire dans 2 variables
$login = isset($_POST['ID']) ? trim($_POST['ID']) : null;
$password = isset($_POST['password']) ? trim($_POST['password']) : null;
// si l'une ou l'autre des variables est vide => erreur
if (!$login || !$password) {
header('Location: login_failed.php');
exit ;
}
// boucle sur le fichier membres
foreach (file('IDtabPWtabdate.txt') as $line) {
// converti la ligne en tableau
$data = explode("\t", $line);
// si il n'y a pas 3 colonnes dans le tableau => saute la ligne
if (count($data) != 3)
continue ;
// converti les données du tableau en forme objet
$member = (object) array_combine(['login', 'passwordHash', 'date'], $data);
// compare le login, vérifie le mot de passe et la date
if ($login == $member->login && password_verify($password, $member->passwordHash)
&& (new DateTime())->format('Y-m-d') < $member->date) {
// connecte l'utilisateur
$_SESSION["MEMBRE"] = "oui";
$_SESSION["login"] = $member->login;
$_SESSION["passe"] = $password;// je vois pas l'intérêt de stocker le mot de passe dans la session...? je dirais même que c'est dangereux
header("Location: espacemembre/acces.php");
exit ;
}
}
// éventuellement ici => compte inexistant ou abonnement terminé
}Code : Tout sélectionner
<?php
session_start();
if ((isset($_POST)) && (!empty($_POST)))
{
$redirect = "http://www.xxx.com/pagededepart.php";
$members_area = "ttp://www.xxx.com/espacemembre/access.php";
$error = "ttp://www.xxx.com/login_failed.php";
error_reporting(E_ALL);
ini_set("display_errors", 1);
// les codes sont-ils fournis ?
if ((!isset($_POST["ID"])) or (!isset($_POST["password"])))
{
header('Location: $error');
// include "$error";
die(""); //pour arrêter le script et l'empêcher d'afficher la page de partenariat
}
// les mettre en variable
$nom2=$_POST["ID"];
$passe2= password_hash($_POST["password"], PASSWORD_DEFAULT); //cryptage en password_hash
// les codes sont-ils vides ?
if (($nom2=="") or ($passe2==""))
{
header("Location: $error");
}
else
{
// verification des codes
$lignes=file("IDtabPWtabdate.txt");
$membre2=0;
$regex="#$nom2#"; //ligne modifiée de sha1 qui serait alors $regex="#$nom2\t$passe2#";
foreach ($lignes as $lgn)
{
if(preg_match($regex,$lgn,$tab))
{
$champ = preg_split('#\t#',$lgn);
if (!password_verify($_POST['password'], $champ[1])) continue; //ligne absente en sha1
$date = $champ[2];
if($date!== false)
{
$now = new Datetime();
$now = $now->format('Y-m-d');
$next = new DateTime($date);
if( $now < $date )
{
$membre2=1;
$id_mem2=$tab[1];
}
}
}// fin if(preg_match)
}//fin foreach
if ($membre2==1)
{
// identifier comme membre
$_SESSION["MEMBRE"]="oui";
$_SESSION["login"]=$nom2;
$_SESSION["passe"]=$passe2;
// sauver les infos de connexion, code fermé utilisant $id_mem2, voir ma remarque plus haut
header("Location: $members_area");
}
else
{
header("Location: $error");
include "$error";
}
}//fin else
}
else {
// premier appel au formulaire
?>
<!DOCTYPE html>
// code texte html dont notamment
<form action="pagededepart.php" method="post">
// etc que du html
</body>
</html>
<?php
}
?>