Est ce sécurisé de concaténer dans une requête sql ?

Messages postés
53
Date d'inscription
samedi 20 juillet 2019
Statut
Membre
Dernière intervention
17 septembre 2019
- - Dernière réponse : jordane45
Messages postés
26317
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 septembre 2019
- 10 sept. 2019 à 10:18
Bonjour,
C'est dans le titre.
Voici un exemple :
$dbreq[1] = $ddb['f']->execute('SELECT * FROM `'.$id.'` WHERE id=`'.$seg.'`');

Cordialement.
Afficher la suite 

4 réponses

Messages postés
26317
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 septembre 2019
1786
0
Merci
Bonjour,
Le mieux est d'utiliser le BINDING de variables si tu travailles en mysqli ou les requêtes préparées si tu bosses en PDO
Par contre, le binding (ou les requêtes préparées) ne fonctionnent que pour les variables que tu utilises dans le WHERE de tes requêtes..... pour ce qui est du FROM , là tu n'as pas d'autres choix

Bien entendu, le risque ne dépend, en réalité, que de la provenance des variables....
Si elles sont accessible à l'utilisateur (soit car elles proviennent d'un formulaire html soit car elles sont envoyées via l'url )

Commenter la réponse de jordane45
Messages postés
53
Date d'inscription
samedi 20 juillet 2019
Statut
Membre
Dernière intervention
17 septembre 2019
0
Merci
Dans mon cas, la variable pour le FROM provient du formulaire...
Que faut-il faire pour sécuriser cela ?
Commenter la réponse de ZombieBot0001
Messages postés
26317
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 septembre 2019
1786
0
Merci
Et bien.. dans ton formulaire tu proposes un "select" (une liste déroulante) avec le nom de tes tables et renvoyant vers un ID
et côté php tu gères avec des if/else ou un SWITCH l'écriture du nom "réel" de ta table

Par exemple
<select name="table">
  <option value="1">Ma table 1</option>
  <option value="2">Ma table 2</option>
</select>

et côté php
 $table = !empty($_POST['table']) ? $_POST['table'] : NULL;

switch($table){
  case 1:
    $laTable= "tabletoto";
    break;
  case 2:
    $laTable= "tabletruc";
    break;
 default:
  echo "Table inconnue !!";
  break;
}

$sql = "'SELECT * FROM `'.$laTable.'`";
try{
  $ddb['f']->execute($sql);

}catch(Exception $e){
  echo "<br> Erreur dans la requête : <br>".$sql;
  echo "<br> Erreur : ". $e->getMessage();
}


NB: Tu sembles bosser en PDO.. je t'invite donc à lire et à appliquer ce qui est indiqué ici : http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

Et également, vu que tu sembles débutant...ceci :
http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code


et pour finir, ça ne fait pas de mal.. ) ça :
http://www.commentcamarche.net/faq/47069-html-php-caracteres-accentues-et-l-utf8

Voila.
https://www.commentcamarche.com/faq/11365-marquer-un-fil-de-discussion-comme-etant-resolu
yg_be
Messages postés
8536
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 septembre 2019
424 > ZombieBot0001
Messages postés
53
Date d'inscription
samedi 20 juillet 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
as-tu des back quotes dans le nom de tables existantes?
évidement, toutes tes tables deviennent vulnérables.
ZombieBot0001
Messages postés
53
Date d'inscription
samedi 20 juillet 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
Je n'ai pas de back quotes dans le nom des tables
jordane45
Messages postés
26317
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 septembre 2019
1786 -
Ce n'est pas qu'une question de backquotes .. il y a tout ce qui peut servir pour les commentaires sql, les apostrophe, les backslashes....
Renseigne toi sur les failles d'injection SQL....

Mais en gros.. si tu veux sécuriser... tu dois CONTRÔLER que les données envoyées par les utilisateurs sont conformes à ce que tu attends.
Toute autre bidouille pour essayer de protéger est inutile !
ZombieBot0001
Messages postés
53
Date d'inscription
samedi 20 juillet 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
Contrôler comment et quelles données ?
yg_be
Messages postés
8536
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 septembre 2019
424 > ZombieBot0001
Messages postés
53
Date d'inscription
samedi 20 juillet 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
contrôler chacune des données.
par exemple, si tu attends le nom de n'importe quelle table de ta base, contrôler que la donnée reçue est bien le nom d'une table.
Commenter la réponse de jordane45
Messages postés
26317
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 septembre 2019
1786
0
Merci
Je reviens sur un message précédent...
Tu indiques :

J'ai besoin que l'utilisateur puisse choisir (En saisissant une chaîne de caractères) une table parmi des millions

Là... je vois deux soucis ...
Primo... comment peux tu avoir des "millions" de tables dans ta bdd ?
Secondo.. qu'est-ce qui justifie qu'un utilisateur puisse avoir accès à cette liste de tables ?

Commenter la réponse de jordane45