sécuriser requete PDO

Eléphant du PHP | 120 Messages

03 mai 2019, 18:49

Bonjour,
j'ai lu des articles sur le fait qu'il fallait sécuriser ses requetes, et que PDO avec prepare() permettait de renforcer la sécurité.

J'ai un petit bout de code pour exemple :

Code : Tout sélectionner

// je récupère mon id passé dans la page par : http://www.monsite.fr/projet-details.php?id=12 $id = $_GET['id']; $sql_produits = "SELECT * FROM produits WHERE id=:id"; $req_produits = $pdo->prepare($sql_produits); $req_produits->bindParam(':id', $id, PDO::PARAM_INT); $req_produits->execute(); $enr_produits = $req_produits->fetch();
Ma question :
si j'ai fait :

Code : Tout sélectionner

// en passant ce paramêtre je pense que j'ai protégé le fait qu'un petit malin passe autre chose qu'un entier dans la var $id $req_produits->bindParam(':id', $id, PDO::PARAM_INT);
est ce que c'est juste ?
Et si oui, quand je teste par exemple id=toto, je n'ai pas de message d'erreur... est ce normal ?

Est ce qu'il serait préférable d'ajouter quand même dès le départ quelque chose comme :

Code : Tout sélectionner

$id = htmlspecialchars($id);
voire

Code : Tout sélectionner

if (!is_int ($id)) echo 'Erreur';
ou tout ceci fait doublon ?
merci de votre aide
si tu as un soucis en informatique, dis toi bien que quelqu'un d'autre l'a eu avant toi

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 mai 2019, 22:34

Il est toujours préférable de contrôler _toutes_ les variables que tu reçois de ton utilisateur pour être sûr que ce soit bien ce que tu attends comme valeur avant de les traiter.
PHP a une fonction très pratique pour cela, c'est filter_var()
http://php.net/filter_var

Tu peux utiliser avec cette fonction différents filtres, qui sont de 2 types principalement :
- Filtres de validation : si la valeur ne correspond pas à ce qui est attendu, alors on rejette tout ce qui est envoyé
- Filtres de nettoyage : on supprime les caractères inattendus pour ne garder que les voulus
Tu as le détail ici : https://www.php.net/manual/fr/filter.filters.php
Quand tout le reste a échoué, lisez le mode d'emploi...