requete pdo

a marqué ce sujet comme résolu.
$req = $bdd->prepare('SELECT '.$_GET['langue_cible'].' FROM traduction WHERE '.$_GET['langue_depart'].' LIKE ?');
$req->execute(array('%'.$mot_chercher.'%'));

Bonsoir chers amis j’ai cette requete là et je me dis qu’il y a des risques d’injection sql mais je sais pas comment faire pour m’en premunir.

Pouvez-vous m’aider? Merci

Nb: $_GET['langue_cible'] et $_GET['langue_depart'] sont des colonnes de ma table traduction

Commence par ne surtout pas utiliser $_GET directement dans la requête. Il faut absolument filtrer l’entrée utilisateur et t’assurer que seules des langues valides et existantes sont utilisées.

Solution simple pour cela, créer un tableau contenant les langues autorisées. Si $_GET['langue_depart'] ou $_GET['langue_cible'] contiennent des valeurs autres que celles qui sont dans ce tableau, tu affiches une erreur et surtout tu n’exécutes pas la requête.

Rappelle-toi toujours ceci:
Never trust user input
Ou, en français:
Ne jamais faire confiance aux entrées utilisateur

+2 -0

Ça fait plus d’un an que tu es sur le forum, tu n’as pas encore traité l’aspect sécurité sur ton apprentissage ? Quand tu écris un logiciel, poses-toi les questions suivante :

  • Comment puis-je détourner ce programme ?
  • Quelle marge de manœuvre je laisse aux utilisateurs ?

Tu devrais être capable de voir toi même le risque dans le code que tu as mis. Sinon, je te conseille vraiment de te documenter à ce sujet ou relire tes cours.

Tu as notamment une partie sur la sécurité dans la doc PHP, intéresse-toi principalement au chapitre Données transmises par les internautes et Sécurité des bases de données.

Coucou :D

Tu peux trouver sur le site tout ce dont tu as besoin pour t’en sortir. ^^
Par exemple, c’est deux tutoriels :

Il y a également d’autres tutoriels sur la sécurité. Au sujet des injections SQL tu trouveras par exemple celui-ci :

Ne pas confondre faille par injection SQL et XSS.

Bonne lecture ! :D

+2 -0

Je suis au courant de toutes ces failles mais dans mon cas je savais pas comment faire. Spacefox ma base contient des tables qui sont les langues et pour chaque ligne les mots et leurs traductions dans ces langues la.

Merci.

Merci aussi Quentin je crois que c’est la solution. Je récupère les langues dans la base et je m’assure que les deux langues de l’utilisateur existe avant de faire la requête.

Dans $mot_chercher, il faudrait aussi échapper les %/\_ à moins de vraiment vouloir laisser l’utilisateur utiliser des masques mais dans ce cas-là tu n’ajouterais pas les %.

Sinon, un identificateur MySQL, ça s’échappe aussi :

$colonne = '`' . str_replace('`', '``', $_GET['langue_cible']) . '`';
$req = $bdd->prepare('SELECT ' . $colonne . ' FROM traduction WHERE ' . $colonne . ' LIKE ?');
$req->execute(array('%' . addcslashes($mot_chercher, '%_') . '%'));

Tout en sachant que bien que tu n’aies pas d’injection SQL là-dessus, avec une colonne qui n’existe pas, la requête planterait (= ce serait à gérer, a minima avec le mode d’erreur de PDO basé sur les exceptions)

PS : il y a visiblement un bug sur le markdown avec `_`

+0 -0

Déjà, qu’est-ce que tu essaies de faire ?

  1. De la traduction d’interface utilisateur ?
  2. De la traduction de vocabulaire ?
  3. Autre chose ?

Dans le cas 1 il y a sans doute des standards qui existent et que tu peux utiliser.

Dans le second cas, tu dois bien partir sur une solution « maison », mais ta structure de table me semble étrange. Que se passe-t-il quand tu veux ajouter une langue ? Tu dois ajouter une colonne à ta table ?

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte