PHP - Injection SQL - Reprenons

Salut,

Bon suite à un topic qui n’a plus réellement d’interêt maintenant, j’aimerais poser quelques questions sur l’injection SQL que je ne comprends pas… J’ai beau tenter pleins d’injections chez moi, la simple variable AddSlashes me bloque tout, alors soit j’ai pas compris comment injecter, soit y a un hic :confused: .

Voici l’exemple sur lequel je me base :

$name="Y";

$sql="SELECT * FROM members WHERE Name LIKE '".AddSlashes($name)."%'";
$req=mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data=mysql_fetch_assoc($req);

echo $sql.'<br /><br>';

var_dump($data);

Ici ça me retourne le premier membre ayant son pseudo commençant par "Y".

Je change ma variable $name par :

$name="Y%'#"

Et là je n’ai plus de résultat…
J’ai juste :

Alors je me demandais comment faire pour échapper un champs avec un AddSlashes sachant que le seule caractère échappatoire dans ma requête SQL est une simple quote…

EDIT : Wahou j’ai fait planté clubic quand j’ai posté ce topic ^o) ! Souffrirait pas d’injection lui aussi avec mes vars ^o) ?

Essaye ton code avec un autre SGBD que mySQL, genre un qui échappe pas les ’ par \. Et utilise le classique ’ OR TRUE OR ‘’ = ’

addslashes ne convient pas pour protéger les requêtes. C’est mysql_real_escape_string pour mySQL. Ca fait au moins trois fois que je me tue à te le dire.

addslashes, c’est pour ça :

eval('$a = "' . addslashes($_GET['machin']) . '";');

ie: protéger une chaîne qui risque d’être utilisée dans un contexte PHP, ou C, etc.

Mais si on utilise que mySQL, AddSlashes suffirait?

Désolé, je sais mais ce que je comprends pas c’est que mysql_real_escape_string ne sert qu’à ajouter un slashe aux caractères suivants : NULL, \x00, \n, \r, \, ', " et \x1a. Or dans mon cas plus haut, la seule façon que j’ai trouvé pour injecter c’est simplement de réussir à introduire une simple quote. C’est ce que fait AddSlashes, et ce que fait mysql_real_escape_string non? Car les autres caractères de mysql_real_escape_string ne permettraient pas d’injecter dans la requête que j’ai mise plus haut, ou alors c’est là mon problème et que je comprends pas.
De plus j’ai qu’il était dit que dans la plupart des cas, la magic_quote_gc permet d’empêcher ces injections car elle ajoute simplement un slash devant les quotes…
Encore le rôle de AddSlashes…

J’vois pas l’interêt de eval dans cet exemple :confused: ? Un simple :
$a = “’” . addslashes($_GET[‘machin’]) . “’”; ne suffirait pas ^o) ?

C’est un exemple, c’est tout.

Je vais pas taper une application de 500 lignes juste pour te montrer, si?

Sinon, c’est justement parce que mysql_real_escape_string apporte d’autres protections qu’il faut s’en servir.

Elle n’existe pas pour rien, hein :slight_smile:

Elle existe parce que mySQL sait très bien comment protéger une chaîne pour l’injecter dans une requête entre ’ et '.

Ok, ok, je comprends mieux, donc en faite dans mon cas AddSlashes suffit, mais il vaut mieux privilégier mysql_real_escape_string qui elle est disons plus complète?

mysql_real_escape_string s’utilise comme AddSlashes dans une requête non? Je comprends mal l’exemple sur php.net, elle s’utilise comme ça non :

$sql="SELECT * FROM members WHERE Name LIKE '".mysql_real_escape_string($name)."%'";

Ou comme une sorte de parser qui s’effectue après du genre :

$sql="SELECT * FROM members WHERE Name LIKE '".AddSlashes($name)."%'";
mysql_real_escape_string($sql);

Dans ce cas là je vois vraiment pas comment elle fonctionnerait pour différencier les simples quotes délimitant un champ et celles de la variable d’netrée :confused: !

Merci.

ça marche addslashes avec le code ASCII de la simple quote ? (&#39 de mémoire)

et t’as essayer en fermant la requète comme un porc ?


; SELECT * FROM * WHERE 1; #

:neutre:

http://www.php.net/manual/fr/function.addslashes.php

Sauf que si le SGBD lit \" comme \" et pas ", alors tu ajoute des caractères, etc.

Y a pleins de fonctions de bidouille pour gérer les ’ mais tu devrais utiliser mysql_real_escape_string… parce que les solutions comme addslahes ou str_replace("’", “’’”, $chaine); ça passe quand tu fais tes petits tests mais la protection n’est qu’illusoire.

du coup, la question centrale, qui reviens et qui nous travaille, c’est quelle est LA fonction qui protège au mieux contre les injections SQL, et comment l’utiliser ?

*sql_real_escape_string()
…et tu l’appelles sur chacun de tes arguments.

M’enfin j’suis rassuré, AddSlashes me protège quand même là :o !

En parlant de protection, le SDZ s’est fait cracké :confused: Ca craint !

mysql_real_escape_string protège au mieux pour mysql
Inutile de tenter le addslashe. Je ne comprends pas la persistence de certains à vouloir utiliser absolument cette fonction.

Pour SDZ: un site pas trop bien codé et un phpBB en forum… y’a pas trop de quoi s’étonner…

DarKChAm > Je ne comprends pas ton entêtement à ne pas utiliser mysql_real_escape_string() :neutre:

Parce qu’il devra changer 50k lignes de code? :smiley:

(au passage, une recherche sur SELECT, UPDATE, DELETE, INSERT te permettra de chopper tes requêtes SQL et de les corriger hein:))

+1…

Disons que je suis “sécurisé” pour l’instant car j’ai utilisé des AddSlashes partout dans mes requêtes, mais les scripts que j’écris maintenant utilisent mysql_real_escape_string() …
Un jour, quand l’envie m’en viendra je corrigerai toutes failles, en attendant je l’ai mis en priorité sur ma liste des failles de mes codages… Un jour je le ferais… Un jour !

du coup moi jvais profiter de la mise a jour de mes scripts pour le faire :miam:
mysql_real_escape_string() que ça s’appelle hein :icon_biggrin:

Bon je suis dans une merde pas possible là, cette fonction c’est vraiment trop nul, elle fout des slashes sur ma table, or ne pouvant pas mettre de strislashes en sortie, ça casse tout mon site…

Comment vous faite ???

Pense à désactiver magic_quote_gpc…

Après m’être avoué que je n’étais voué qu’au suicide, j’ai repensé à cette connerie, et j’ai regardé sur mon serveur… Elle est a ON !!! Hoo la vilaine ! Donc du coup j’ai improvisé une fonction qui test si elle est On et si oui fait un stripslash :confused: !

Pfiouh j’lai echappé belle, mais du coup je dois ré-éditer toutes mes lignes de prog’ avec le nom de ma fonction Huhu xD!