Bonjour,

Voilà alors étant donné que je me sens un petit peu vieux a traité mes requêtes SQL encore avec mysql() j'ai décidé de faire djeuns et de me mettre au PDO j'ai compris globalement le système mais j'aurais une petite question ou je ne trouve pas de réponse pertinente concernant la sécurité :

exemple: avant pour mes requêtes SQL sensible (contenant des $_GET) je les protégeais avec un simple
"mysql_real_escape_string()" ou "mysql_escape_string() "

Désormais en PDO j'ai du mal à savoir comment sécuriser mes variables , le petit "Hic" c'est que je n'aime pas du tout les requêtes préparer et je préfère utiliser mes requêtes en concaténation. Or j'ai lu qu'en concaténation la "sécurité" présente en requête préparé ne s'applique plus

donc ma question est la suivante est-ce que je peux utiliser mysql_escape_string() dans mes requêtes en concaténation en PDO du style:

 $sql = 'SELECT * FROM serveur WHERE id="'.mysql_escape_string($_GET['id']).'" AND user="'.$_SESSION['auth']['username'].'"'; 
         $req=$DB ->prepare($sql);
         $req = $DB ->query($sql);
         $data = $req->fetch(PDO::FETCH_ASSOC);       

ou je devrais plutôt utiliser l'élément PDO -> Quote ?

Je vous remercie d'avance pour vos réponses cordialement didoupimpon.

4 réponses


AlexJM
Réponse acceptée

Déjà, sache qu'il y a plusieurs manières d'approcher les requêtes préparées avec PDO.
Par exemple pour sélectionner l'utilisateur avec l'id 2 :
1)

$req = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$req->execute([2]);
$user = $req->fetch();

2)

$req = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$req->execute([':id' => 2]);
$user = $req->fetch();

3)

$req = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$req->bindParam(':id', $id);
$id = 2;
$req->execute();
$user = $req->fetch();

4)

$req = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$req->bindValue(':id', 2);
$req->execute();
$user = $req->fetch();

Ensuite oui, si tu veux faire vraiment avec query, il est conseillé d'utiliser Pdo::quotes

Je ne connaiser que la requête préparé 3 bon ba je vais me mettre au requête préparé ducoup Merci beacoup

Pas de problème ;)

Les requêtes préparées sont faites en principe pour répéter plusieur fois la même requête avec des jeux de paramètres différents.
Mais comme en plus ça "protège" les paramètres, c'est bien pratique.
Sauf que c'est plus lent car on double les appels au serveur
Pour une requête ayant comme critère un simple id de type entier, les requêtes préparées ne se justifient pas
il suffit juste de concaténer le "intval()" du paramètre, il n'y a pas d'injection possible avec un entier.