il y as quelques jours, j'ai crée un sujet pour l'affichage du nombre de visiteur, maintenant j'essaye de faire de même pour l'affichage des pseudo des utilisateurs connectés sur le chat, tout fonctionne (enregistrement sur la BDD de plusieurs pseudo, la suppression lors d'inactivité etc..., le problème, c'est l'affichage, je galère pour affiché les pseudos connectés.
voici le code
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=monsite;charset=utf8', 'root', '');
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
// ÉTAPE 1 : on vérifie si le pseudo se trouve déjà dans la table.
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "pseudo" le pseudo du visiteur.
$pseudo = $bdd->query('SELECT pseudo AS existe_pseudo FROM connect_chat WHERE pseudo="'.$_SESSION['pseudo'].'"');
$pseudoExist = $pseudo->rowCount();
if ($pseudoExist === 0) // Le pseudo ne se trouve pas dans la table, on va l'ajouter.
{
$bdd->query('INSERT INTO connect_chat (pseudo, timestamp) VALUES ("'.$_SESSION['pseudo'].'", "'.time().'")');
}
else // Le pseudo se trouve déjà dans la table, on met juste à jour le timestamp.
{
$bdd->query('UPDATE connect_chat SET timestamp="'.time().'" WHERE pseudo="'.$_SESSION['pseudo'].'"');
}
// ÉTAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 2 minutes.
// On stocke dans une variable le timestamp qu'il était il y a 2 minutes :
$timestamp_min = time() - (60 *2); // nombre en secondes multiplié par nombre de minute
$bdd->query('DELETE FROM connect_chat WHERE timestamp<"'.$timestamp_min.'"');
// ÉTAPE 3 : on compte le nombre de pseudo stockées dans la table. C'est le nombre de visiteurs connectés.
$retour = $bdd->query('SELECT GROUP_CONCAT(pseudo SEPARATOR ", ") AS existe_pseudo FROM connect_chat')->fetchAll();
echo '<p>Il y a actuellement ' . $retour ['existe_pseudo '] . ' comme visiteurs sur le chat !</p>';
?>
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=monsite;charset=utf8', 'root', '');
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
// ÉTAPE 1 : on vérifie si le pseudo se trouve déjà dans la table.
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "pseudo" le pseudo du visiteur.
$pseudo = $bdd->query('SELECT count(*) as nombre FROM connect_chat WHERE pseudo="'.$_SESSION['pseudo'].'"');
$retour = $pseudo->fetch();
if ($retour['nombre'] == 0) // Le pseudo ne se trouve pas dans la table, on va l'ajouter.
{
$bdd->query('INSERT INTO connect_chat (pseudo, timestamp) VALUES ("'.$_SESSION['pseudo'].'", "'.time().'")');
}
else // Le pseudo se trouve déjà dans la table, on met juste à jour le timestamp.
{
$bdd->query('UPDATE connect_chat SET timestamp="'.time().'" WHERE pseudo="'.$_SESSION['pseudo'].'"');
}
// ÉTAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 2 minutes.
// On stocke dans une variable le timestamp qu'il était il y a 2 minutes :
$timestamp_min = time() - (60 *2); // nombre en secondes multiplié par nombre de minute
$bdd->query('DELETE FROM connect_chat WHERE timestamp<"'.$timestamp_min.'"');
// ÉTAPE 3 : on compte le nombre de pseudo stockées dans la table. C'est le nombre de visiteurs connectés.
$retour = $bdd->query('SELECT GROUP_CONCAT(pseudo SEPARATOR ", ") AS existe_pseudo FROM connect_chat')->fetchAll();
echo '<p>Il y a actuellement ' . $retour ['existe_pseudo '] . ' comme visiteurs sur le chat !</p>';
?>
Ca ne sert à rien, ton tableau se promène dans le code au lieu d'être en 4^e paramètre de l'appel du constructeur de PDO.
Il y a des injections SQL via $_SESSION['pseudo'] puisque les requêtes ne sont pas préparées et il n'y a strictement aucun échappement pour autant.
Un echo d'un fetchAll (tableau de tableaux), ça ne peut que donner "Array" (ou NULL/'' vu que la clé n'existe pas), ça devrait être un simple fetch en l'état. Mais je déconseille l'usage GROUP_CONCAT qui n'est acceptable que tant que le nombre de lignes/données reste limité.
C'est pour cela que je te disais de faire un var_dump de ton résultat : tu vois bien que tu as un index 0 à ton array. Après c'est vrai qu'un fetchAll() n'a pas trop d'intérêt ici, mais c'était pour te guider plutôt que de te donner une solution toute faite.
Donc avec fetchAll() , il faudrait récupérer $retour[0]['existe_pseudo ']
> Lui ne fait que récupérer la $_SESSION['pseudo']
Et si je m'appelle : "; DROP TABLE connect_chat CASCADE; # ou je ne sais quoi, tu crois qu'il se passe quoi ?
Tu crois que c'est parce que ton INSERT est préparée que ça te dispense de préparer le reste ? Tu es fou de le croire surtout qu'une injection SQL, avec pdo_mysql et l'émulation activée, ça ne pardonne pas ...
De toute façon, même sans parler d'injections SQL, il suffit d'une " dans le pseudo pour faire planter tous tes SELECT ...
j'ai fais des tests, j'ai mis "<strong> comme pseudo, effectivement catastrophe, tout c'est retrouvé en gras
Alors qu'avant que je n'inclut le fichier si présent au dessus, j'avais déjà fait le test et aucun problème, c'est à dire qu'il faut que je le sécurise.
Tu me conseil quoi alors ? requête préparé et ?
Edit:pourtant dans l'envoi du pseudo j'avais fais un
la requête prépare, faut mieux la faire sur l'étape 1 (lors de la vérification, si le pseudo existe déjà dans la table) ou sur l'étape 2 (lors de l'enregistrement si le pseudo n'est pas déjà dans la table). ou sur les deux .
> Le fait qu'il y a un regex comme celui-ci, ça limite les injections ou pas ?
Pourquoi tu veux "limiter" une injection SQL au lieu de ne pas en avoir du tout en préparant correctement TOUTES tes requêtes ? On ne restreint pas les caractères utilisables pour un pseudo au nom de la sécurité, c'est que cette dernière est laxiste si on en est à la considérer ainsi ; si on le fait c'est motivé par des choix techniques (type pour utiliser des notifications derrière), pas pour la sécurité.
S'il y a un truc qui te prémunit d'une injections SQL c'est de préparer la requête (sinon de tout échapper/caster comme il faut). C'est ça qui te l'assure, pas une regexp. Si peu que tu oublies de la réutiliser à la modification du pseudo de l'utilisateur ou que tu fasses une erreur dessus (pas sûr que le - et avec le manque du modificateur u, elle soit vraiment correcte en plus), tu te retrouves strictement au même point.
> la requête prépare, faut mieux la faire sur l'étape 1 (lors de la vérification, si le pseudo existe déjà dans la table) ou sur l'étape 2 (lors de l'enregistrement si le pseudo n'est pas déjà dans la table). ou sur les deux :(.
TOUTES ! Je ne comprends même pas que tu puisses penser que ça puisse être facultatif par endroits. C'est tout ou rien. La sécurité, il suffit d'une brèche pour tout menacer (et ton code en présente plus qu'une ...). J'ai fermé la porte à clé mais laissé une des fenêtres ouvertes : est-ce suffisant pour ne pas être cambriolé ? lol
j'ai tenté de faire au mieux mais j'ai des erreurs, je vous donne le code
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=monsite;charset=utf8', 'root', '');
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
// ÉTAPE 1 : on vérifie si le pseudo se trouve déjà dans la table.
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "pseudo" le pseudo du visiteur.
$reqpseudo = $bdd->prepare('SELECT pseudo AS existe_pseudo FROM connect_chat WHERE pseudo= ?');
$reqpseudo->execute(array($_SESSION['pseudo']));
$pseudoExist = $pseudo->fetch();
if ($pseudoExist == 0) // Le pseudo ne se trouve pas dans la table, on va l'ajouter.
{
$bdd->prepare('INSERT INTO connect_chat (pseudo, timestamp) VALUES (?, ?)');
$bdd->execute(array($_SESSION['pseudo'], time()));
}
else // Le pseudo se trouve déjà dans la table, on met juste à jour le timestamp.
{
$bdd->query('UPDATE connect_chat SET timestamp="'.time().'" WHERE pseudo="'.$_SESSION['pseudo'].'"');
}
// ÉTAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 1 minutes.
// On stocke dans une variable le timestamp qu'il était il y a 1 minutes :
$timestamp_min = time() - (60); // nombre en secondes par minute
$bdd->query('DELETE FROM connect_chat WHERE timestamp<"'.$timestamp_min.'"');
// ÉTAPE 3 : on compte le nombre de pseudo stockées dans la table. C'est le nombre de visiteurs connectés.
$retour = $bdd->query('SELECT GROUP_CONCAT(pseudo SEPARATOR ", ") AS existe_pseudo FROM connect_chat')->fetchAll();
$utilisateur = htmlspecialchars($retour[0][0]);
?>
et voici mes erreurs
Et je pense qu'il a pas fini d'interpréter le code ...
$reqpseudo = $bdd->prepare('SELECT pseudo AS existe_pseudo FROM connect_chat WHERE pseudo= ?');
$reqpseudo->execute(array($_SESSION['pseudo']));
$pseudoExist = $pseudo->fetch();
Faudrait plutôt que je mette
$reqpseudo = $bdd->prepare('SELECT pseudo AS existe_pseudo FROM connect_chat WHERE pseudo= ?');
$reqpseudo->execute(array($_SESSION['pseudo']));
$pseudoExist = $reqpseudo->fetch();
Oui...., ça fonctionne mieux, je continu à faire les tests voir si, il affiche, delete, etc..!
Edit :
Donc, tout allait bien car le pseudo étais encore dans la bdd, et je me suis connecté d'un autre pc pour voir et là ça fonctionne pas, j'ai donc supprimer le pseudo contenu dans la bdd et du coup comme il n'est pas dedans et ben ça fonctionne plus (logique)
Si je peux me permettre, je te rappelle que tu parle un un grand débutant, voire novice, essaie d'employé des termes correspondant à mon niveau , le plus simple serait un exemple suivi d'une explication pas trop compliqué adapté que je puisse comprendre
Bon, voici un code qui fonctionne, et sécurisé, enfin, je pense, j'attends vos avis, voici le code
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=monsite;charset=utf8', 'root', '');
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
// ÉTAPE 1 : on vérifie si le pseudo se trouve déjà dans la table.
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "pseudo" le pseudo du visiteur.
$reqpseudo = $bdd->prepare('SELECT pseudo AS existe_pseudo FROM connect_chat WHERE pseudo= ?');
$reqpseudo->execute(array($_SESSION['pseudo']));
$pseudoExist = $reqpseudo->fetch();
if ($pseudoExist == 0) // Le pseudo ne se trouve pas dans la table, on va l'ajouter.
{
$verif = $bdd->prepare('INSERT INTO connect_chat (pseudo, timestamp) VALUES (?, ?)');
$verif->execute(array($_SESSION['pseudo'], time()));
}
else // Le pseudo se trouve déjà dans la table, on met juste à jour le timestamp.
{
$verif = $bdd->prepare('UPDATE connect_chat SET timestamp="'.time().'" WHERE pseudo="'.$_SESSION['pseudo'].'"');
$verif->execute(array($_SESSION['pseudo']));
}
// ÉTAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 1 minutes.
// On stocke dans une variable le timestamp qu'il était il y a 1 minutes :
$timestamp_min = time() - (60*2); // nombre en secondes par minute * par nombre de minute
$bdd->query('DELETE FROM connect_chat WHERE timestamp<"'.$timestamp_min.'"');
// ÉTAPE 3 : on compte le nombre de pseudo stockées dans la table. C'est le nombre de visiteurs connectés.
$retour = $bdd->query('SELECT GROUP_CONCAT(pseudo SEPARATOR ", ") AS existe_pseudo FROM connect_chat')->fetchAll();
$utilisateur = htmlspecialchars($retour[0][0]);
?>
× 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.
Ricem
N'oubliez pas d'activer les erreurs PDO.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Ricem
N'oubliez pas d'activer les erreurs PDO.
Ricem
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Ricem
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Ricem
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Ricem
N'oubliez pas d'activer les erreurs PDO.
Ricem
N'oubliez pas d'activer les erreurs PDO.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Ricem
Ricem
N'oubliez pas d'activer les erreurs PDO.
Ricem
N'oubliez pas d'activer les erreurs PDO.
Ricem
N'oubliez pas d'activer les erreurs PDO.
Ricem
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Ricem
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Ricem
Ricem