[SQL] Problème de sécurisation des requêtes.

Résolu
Exileur Messages postés 1475 Date d'inscription   Statut Membre Dernière intervention   -  
Exileur Messages postés 1475 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

J'ai programmer une petite page de test, pour tester la sécurité de ma fonction de sécurisation mais malgré l'utilisation de toute les fonctions, les injections SQL sont toujours possible...

Voila le code de la page de test :

<h3>test faille sql</h3>
<form method='get' action='#'>
<input type='text' name='sql'/>
<input type='submit'/>
</form></br>

<?php
if(isset($_GET['sql']))
{

function secure($chaine)
{
if(get_magic_quotes_gpc())
{
$chaine = stripslashes($chaine);
$chaine = htmlspecialchars($chaine);
return mysql_real_escape_string($chaine);
}
else
{
$chaine = htmlspecialchars($chaine);
return mysql_real_escape_string($chaine);
}
}

$piece = secure($_GET['sql']);

$host = "localhost";
$user = "root";
$password = "";
$bdd = "gestion";

mysql_connect($host, $user, $password) or die ("Connexion au serveur impossible");
mysql_select_db($bdd) or die ("Connexion a la base impossible");

$query = " SELECT * FROM ".$piece."";
$result = mysql_query($query);
$Nombre = mysql_num_rows($result);

if ($Nombre == "0")
{ echo "aucun resultat"; }
else
{
while($donnees = mysql_fetch_array($result))
{
echo "<HR width='75'/>";
echo 'reference : '.$donnees['reference'].'</br> nom : '.$donnees['nom'].'</br> marque : '.$donnees['marque'].'</br> model : '.$donnees['model'].'</br> qt : '.$donnees['qt'].'</br> description : '.$donnees['description'].'</br></br>';
}
}
}

Ma table s'appel cm, elle contient 7 colonnes.
Lorsque je rentre dans le formulaire :

"cm union select 1,2,3,4,5,@@version,7--"

Le code s'execute normalement et la version de php s'affiche...




N'oubliez pas de marquez votre post comme résolut lorsque vous avez eu les réponses à vos questions...
Au royaume des aveugles, les borgnes sont rois.

2 réponses

le père
 
Coucou ^^

C'est parce que tu n'as pas mis ton nom de table entre accents graves.
Je n'avais pas pensè à ce cas, faut dire que je n'ai jamais eu besoin de mettre un nom de table en variable. À moins de vouloir refaire phpMyAdmin, je ne vois pas très bien à quoi ça peut servir.

Tu as écrit :
$query = " SELECT * FROM ".$piece.""; 

Sais-tu à quoi sert le ."" à la fin de cette ligne ? C'est une absurdité !

Tu aurais dû écrire
$query = " SELECT * FROM '".$piece."'"; 

(les ' sont des accents graves, touche 7 et non pas des apostrophes touche 4)
1
Exileur Messages postés 1475 Date d'inscription   Statut Membre Dernière intervention   150
 
=), Merci beaucoup, je sais que je suis d'une absurdité déconcertante ;)

Super, ça fonctionne niquel !!

J'ai essayer avec une quote, mais j'obtiens une erreur.. Why ? (vraiment déconcertant... et, de plus, obstiné dans la bêtise :p)
Quel est la difference entre le quote et cet accent grave ?
Depuis le début, j'emploierai une quote au lieu de cet accent ? :o

Pour ce qui est de l'incrementation, en suivant ma "logique" de départ, la fonction aurait du être comme ceci :
$query = " SELECT * FROM ".$piece; // ?

Merci beaucoup pour cette aide précieuse !
0
Exileur Messages postés 1475 Date d'inscription   Statut Membre Dernière intervention   150
 
Pour ce qui est du nom de table en variable, hors contexte, ça peux paraitre bizarre.

Enfaite, il s'agit d'un site qui va gérer les stocks de pièces de pc portable. Et chaque table et un type de pièce. cm, plasturgie, etc...

La table change donc selon le type de pièce sélectionné. Mais pas la requête.
0
le père
 
J'ai essayer avec une quote, mais j'obtiens une erreur.. Why ? (vraiment déconcertant... et, de plus, obstiné dans la bêtise :p)
Quel est la difference entre le quote et cet accent grave ?

En MySQL (malheureusement, SQL diffère sur ce point d'une variante à l'autre) les accents graves servent à délimiter les noms de table ou de champ, alors que la quote sert à délimiter une valeur non numérique.
L'accent grave n'est pas obligatoire en général autour des noms de table ou de champ, alors que la quote l'est toujours autour d'une valeur non numérique. Sinon, par exemple, dans un cas comme :
... WHERE truc = machin
mySQL ne pourrait pas deviner si tu compares les colonnes truc et machin, ou si tu recherches le texte machin dans la colonne truc, ou si tu recherches le texte truc dans la colonne machin, etc...
0
Exileur Messages postés 1475 Date d'inscription   Statut Membre Dernière intervention   150
 
Coucou, de nouveau un problème, mais coté JS cette fois-ci, j'espère que tu pourras m'aider =)

https://forums.commentcamarche.net/forum/affich-23676766-js-recharger-une-page-depuis-une-pop-up
0