J'ai parcouru pas mal le web et je n'ai pas eu de solution. En fait, j'ai réalisé un script pour gérer les articles et aussi créer des pages
web. Jusque là aucun souci, le petit cms a pu me donner un blog avec modération de commentaires sans souci. Le seul problème est
la page d'administration protégée évidemment par des sessions. Pendant que j'y navigue, la session s'expire seule. J'ai session_start() sur toutes
les pages.
Mon code comprend dans le dossier admin :
- index.php où se trouve mon formulaire
- admin.php pour le traitement du formulaire
- tableau-de-bord.php
- les autres fichiers php
admin.php
<?php
session_start();
if (isset($_POST['connexion']) )
{
if( trim(htmlspecialchars($_POST['token1']))==$_SESSION['validation_form_required1'] )
{
if( trim(htmlspecialchars($_POST['token2']))==$_COOKIE['token2'] )
{
if( empty($_POST['commento-url']) )
{
$interval=round(time()-htmlspecialchars($_POST['menuterie']) ) ;
if( $interval>10 )
{
$hach_pass="grain_de_sel".sha1($_POST['pass'])."grain_de_sel2";
try{
include("includes/bdd_connect.php");
$req = $bdd->prepare('SELECT id, full_name, login, mail, phone_number, pass, habilitation, avatar, profile, DAY(date_creation) As jour, MONTH(date_creation) As mois, YEAR(date_creation) As annee, HOUR(date_creation) As heure, MINUTE(date_creation) As minutes, ip FROM account WHERE login=:login AND pass=:pass');
$req->execute(array(
'login'=>$_POST['login'],
'pass'=>$hach_pass
));
$resultat = $req->fetch();
$_SESSION['id']=$resultat['id'];
$_SESSION['full_name']=$resultat['full_name'];
$_SESSION['login']=$resultat['login'];
$_SESSION['mail']=$resultat['mail'];
$_SESSION['phone_number']=$resultat['phone_number'];
$_SESSION['pass']=$resultat['pass'];
$_SESSION['habilitation']=$resultat['habilitation'];
$_SESSION['avatar']=$resultat['avatar'];
$_SESSION['profile']=$resultat['profile'];
$_SESSION['jour']=$resultat['jour']; $_SESSION['mois']=$resultat['mois']; $_SESSION['annee']=$resultat['annee']; $_SESSION['heure']=$resultat['heure']; $_SESSION['minutes']=$resultat['minutes'];
if (!$resultat)
{
// incorrect login or password
header('Location:index.php?f=241ae00989d1995ffcbbf63d579943635faf9751bb0e1f8f7ff40bbc866cdb67c9f0e');
exit();
}else{
$_POST['ip_online']=$_SERVER['REMOTE_ADDR'];
$users_online = $bdd->prepare('SELECT * FROM users_online WHERE login=:login OR ip=\''.$_POST['ip_online'].'\' ');
$users_online->execute(array( 'login'=>$_POST['login'] ));
$ref = $users_online ->fetch();
if($ref['login']==$_POST['login'] OR $ref['ip']==$_POST['ip_online'] )
{
// connected since other place or didn't logout
$users_online = $bdd->prepare('DELETE FROM users_online WHERE login=:login OR ip=\''.$_POST['ip_online'].'\' ');
$users_online->execute(array( 'login'=>$_POST['login'] ));
header('Location:index.php?c=2943635f41aee1f8f7ff40bbc00989d1995ffcbbf63d579af9751bb0866cdb67c9f0e');
exit();
echo "<meta http-equiv='Refresh' content='10'> ";
}else{
// ===insert ip in online user's table =======================
$_POST['ip']=$_SERVER['REMOTE_ADDR']; $timestamp=time();
$req=$bdd->prepare("INSERT INTO users_online( ip, timestamp, login ) VALUES(:ip, :timestamp, :login )");
$req->execute(array('ip'=>$_POST['ip'],'timestamp'=>$timestamp,'login'=>$_SESSION['login']));
header('Location:tableau-de-bord.php');
}
}
$req->closeCursor();
}
catch(Exception $e)
{
die ('Erreur: ' .$e->getMessage());
}
}else
{
echo" Your attitud has been detected as a robot spammer ";
}
}else // Url honeypot have been fill, so it's robot, rejet the request
{
echo " We cannot continue with your request because you are identified as robot ";
}
}else
{
echo " No token 2 found in your request ";
}
}else // no token1 found
{
echo" No token found in your request ";
}
}
?>
Dans le formulaire, il y a des champs cacher pour la gestion anti-bot, faille CRSF.
includes/bdd_connect.php c'est pour la connexion à la bdd
J'ai un fichier authentify-user.php inclut avant tout code HTML sur les pages protégées contenant
Il est normal ton projet mais une petite recherche t'aurai surement montrer que les sessions en php on une durée de validité (30 minutes par défaut). Il faut donc en tenir compte.
Par contre quand je vois ou se trouve l'indentation et les fonctions utilisé j'ai presque envie de dire que c'est tout le code qui est à revoir.
Le temps de session dépends du serveur sur lequel il est mis en place. Fait une petite recherche sur comment modifier une durée de session php (time session php) sur serveur, ça doit probablement être dans ton php.ini.
---------- Rien ne sert d'écrire vite si l'algorithme est mauvais ----------
J'ai déjà fait des recherches et ça n'a rien à voir à ma connaissance. Depuis quand l'indentation
pose problème en PHP ? J'ai bien précisé admin.php ne me crache aucune erreur,
Je dis pas que le code marche pas, mais que le code produit actuellement est vraiment pas propre et utilise des choses inutiles. Un code comme ça chez nous, tu es viré aussi sec.
Voici comment je verrais le code de mon côté :
<?php
session_start();
if (!empty($_POST)) {
$sessionValidFormRequired = $_SESSION['validation_form_required1'] ?? null;
$cookieToken2 = $_COOKIE['token2'] ?? null;
$token1 = $_POST['token1'] ?? null;
$token2 = $_POST['token2'] ?? null;
$urlComment = $_POST['commento-url'] ?? null;
$minuterie = $_POST['menuterie'] ?? 0;
$login = $_POST['login'] ?? null;
$pass = $_POST['pass'] ?? null;
$errors = [];
if (empty($sessionValidFormRequired) && empty($cookieToken2)) {
$errors[] = 'Missing token';
}
if (empty($token1) && empty($token2) && empty($urlComment) && empty($login) && empty($pass)) {
$errors[] = 'Missing necessery field in form';
}
if ($sessionValidFormRequired !== $token1 || $cookieToken2 !== $token2) {
$errors[] = 'Token 1 or 2 invalid';
}
$interval = time() - intval($minuterie);
if ($interval <= 10) {
$errors[] = 'Robot spam';
}
if (empty($errors)) {
// require à la place d'include c'est mieux
require __DIR__ . '/includes/bdd_connect.php';
$reqSelect = $bdd->prepare('SELECT id, full_name, login, mail, phone_number, pass, habilitation, avatar, profile, date_creation, ip
FROM account WHERE login = :login');
$reqSelect->execute([
':login' => $login
]);
$user = $reqSelect->fetch();
if ($user && password_verify($pass, $user['pass'])) {
// Il ne faut plus utiliser sha1 surtout que
// password_hash gère très bien le sel dynamique et
// permet l'utilisation d'algo plus puissant.
// User ok
// on retire le mdp, jamais stoquer le mdp
// ailleurs quand bdd
unset($user['pass']);
$_SESSION['auth'] = $user;
} else {
header('Location:index.php?f=241ae00989d1995ffcbbf63d579943635faf9751bb0e1f8f7ff40bbc866cdb67c9f0e');
exit();
}
// Le reste du code. Attention à tes requête qui intègre les valeurs
// il faut les préparer.
header('Location:tableau-de-bord.php');
exit();
}
}
Sinon on parlait bien du temps d'inactivité. Les sessions sont gérer avec un cookie dont le lifetime correspond à celui indiqué dans le fichier php.ini
Je reviens tardivement après des voyages par ci et par là. J'ai finalement découvert tout seul l'erreur que je partage car
en parcourant plusieurs forums PHP sur la toile, certains ont connu le même pb et rien à mettre sous la dent.
J'ai réalisé le constat selon lequel pour écrire
<?php
session_start();
?>
il ne faut aucunement laisser d'espace, ni de saut de ligne, ni faire une tabulation sinon perte de session de manière aléatoire.
@Mateo21 dans son cours PHP & Myql ne m'avait pas fait cette remarque pertinente tout comme sur l'usage de la fonction header()
qui doit être appliquée dans un contexte particulier. Mon CMS est en bon état à présent.
Sessions PHP qui s'expirent seules
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
My website : Mon serveur discord, Se demerder tout seul, Faille XSS et SQL
---------- Rien ne sert d'écrire vite si l'algorithme est mauvais ----------
My website : Mon serveur discord, Se demerder tout seul, Faille XSS et SQL