Page 1 sur 1

Script qui fonctionne sans certaines valeurs

Posté : 28 mars 2019, 20:06
par cortoh
Bonjour,
J'ai reproduit un tuto pour effectuer une requête "DELETE" tout fonctionne parfaitement voir mème un peu trop, je m'explique : afin de bien comprendre comment tout fonctionne j'ai fais quelques tests pour voir comment réagit le script en modifiant certaines valeurs, par exemple j'ai volontairement modifié la variable $login par un faux login et à ma grande surprise le script fonctionne et j'ai réussi à supprimer des données de ma bdd, idem pour la variable $serveur et de mème le nom de la table (dbname=visdom;) la seule variable qui ne transige pas ces le mot de pass, pouvez-vous m'expliquer pourquoi ça fonctionne quand mème sans ces valeurs ? svp
<?php

	$serveur = "xxxx"; // Fonctionne mème si erroné
	$login = "xxxx"; // Fonctionne mème si erroné
	$pass = "xxxx";
	
	try

	{
         // dbname=visdom;  fonctionne mème si erroné
        $bdd = new PDO('mysql:host=$serveur;dbname=visdom;charset=utf8', $login, $pass); 
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	}

	catch(Exception $e)

	{
        die('Erreur : '.$e->getMessage());
	}
 
	$req = $bdd->prepare('DELETE FROM visdom WHERE nom_cl = :nom_cl AND prenom_cl = :prenom_cl');
					  
    $req->bindValue('nom_cl',$_POST['nom_cl']);
    $req->bindValue('prenom_cl',$_POST['prenom_cl']);
	

   
	if (!$req->execute()) 
		
	{
		echo 'Erreur';
	} 
		
	else 
		
	{
		echo "connexion_bdd=1";
	}

?>

Re: Script qui fonctionne sans certaines valeurs

Posté : 12 avr. 2019, 22:50
par pukes07
Bonjour Cortoh,

J'ai écris ton code avec quelques modifications ainsi que des commentaire pour t'aider sur ce sujet. Si cela t'aide tant mieux.

<?php

// Prends l'habitude de bien nommer tes variables
$host = 'localhost';
$dbName = 'visdom';
$user = 'root';
$password = 'root';

try {
    $bdd = new PDO('mysql:host='.$host.';dbname='.$dbName.';charset=utf8', $user, $password);
    // Tu peux aussi mettre tes variables comme à la ligne suivante mais avec des double quotes pour que tes variables
    // soient évaluées comme variable et pas commme une simple chaine de caractères
//    $bdd = new PDO("mysql:host=$host;dbname=$dbName;charset=utf8", $user, $password);
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(Exception $e) {
    die('Error : '.$e->getMessage());
}

// Parfois selon la requete que tu écris, la séparer sera plus lisible
// Apres ton FROM, il faut que tu mette le nom de ta table, sauf si c'est aussi "visdom" biensur, mais mon petit doigt
// me dit que c'est peu probable...
$sqlRequest = 'DELETE FROM visdom.user
    WHERE first_name = :firstName 
    AND last_name = :lastName'
;
$request = $bdd->prepare($sqlRequest);
// Pour binValue, le parametre doit avoir les : il me semble.
// Pour la valeur, prends le temps de faire des vérifications
$request->bindValue(':firstName',htmlspecialchars($_POST['firstName']));
$request->bindValue(':lastName',htmlspecialchars($_POST['lastName']));

// Et la tu ne sais pas encore si l'utilisateur est bien supprimé de ta base de données...
if (!$request->execute()) {
    echo 'Error';
} else {
    echo 'Request executed';
}

// To be continued
// Good luck

Re: Script qui fonctionne sans certaines valeurs

Posté : 13 avr. 2019, 00:03
par or 1
// Pour la valeur, prends le temps de faire des vérifications
$request->bindValue(':firstName',htmlspecialchars($_POST['firstName']));
non. utiliser pdo permet justement de ne pas avoir à s'occuper de protéger les données, donc
$request->bindValue(':firstName', $_POST['firstName']);

Re: Script qui fonctionne sans certaines valeurs

Posté : 13 avr. 2019, 11:09
par pukes07
Bonjour,

PDO ne protège pas les données. Pour le cas présent, c'est pour une requête DELETE, donc pas de problème à mon avis. Seulement si c'est pour du UPDATE ou INSERT, il est préférable de faire d'avantage de vérifications.

Le risque peut-être par exemple d'afficher le nom d'un utilisateur, depuis la base de données, qui aurait remplacé son nom par des balises et du script, un peu d'imagination et on se rend compte du danger.

Donc les requêtes préparées permettent d'éviter les injections SQL, mais n’empêchent pas les failles XSS.