OVH Cloud OVH Cloud

parsé les param

8 réponses
Avatar
Alexandre Jaquet
Hello

J aimerais parsé les param provenant d'un formulaire pour empecher
l injection sql

quelle est la meilleure méthode en perl ?


merci

8 réponses

Avatar
Stephane Zuckerman
J aimerais parsé les param provenant d'un formulaire pour empecher
l injection sql

quelle est la meilleure méthode en perl ?


As-tu essayé d'utiliser le flag -T ? :-) (taint mode)

Sinon, le module DBI contient une méthode quote() qui permet de quoter
systématiquement tes requêtes, ce qui permet d'éviter qu'un petit malin
rentre quelque chose du genre

toto' OR '1=1

dans un champ de saisie par exemple.



--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
Alexandre Jaquet
J aimerais parsé les param provenant d'un formulaire pour empecher
l injection sql

quelle est la meilleure méthode en perl ?



As-tu essayé d'utiliser le flag -T ? :-) (taint mode)

Sinon, le module DBI contient une méthode quote() qui permet de quoter
systématiquement tes requêtes, ce qui permet d'éviter qu'un petit malin
rentre quelque chose du genre

toto' OR '1=1

dans un champ de saisie par exemple.



nickel je v jetté un oeil merci



Avatar
Patrick Mevzek
Sinon, le module DBI contient une méthode quote() qui permet de quoter
systématiquement tes requêtes, ce qui permet d'éviter qu'un petit malin
rentre quelque chose du genre

toto' OR '1=1

dans un champ de saisie par exemple.


CE qui ne règle pas le problème de toutes les injections SQL, car on
peut en faire sans utiliser de '

La bonne solution avec DBI est d'utiliser les prepared statements.
Et de filtrer les données, avant d'appliquer éventuellement des
opérations de protection de caractères (inutiles si usage des prepared
statements)

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
Alexandre Jaquet

Sinon, le module DBI contient une méthode quote() qui permet de quoter
systématiquement tes requêtes, ce qui permet d'éviter qu'un petit malin
rentre quelque chose du genre

toto' OR '1=1

dans un champ de saisie par exemple.



CE qui ne règle pas le problème de toutes les injections SQL, car on
peut en faire sans utiliser de '

La bonne solution avec DBI est d'utiliser les prepared statements.
Et de filtrer les données, avant d'appliquer éventuellement des
opérations de protection de caractères (inutiles si usage des prepared
statements)



un code comme celui ci est il vulnérable ?

sub sqlSelect {
my $select = shift || '';
my $from = shift || '';
my $where = shift || '';
my $other = shift || '';


my $sql="SELECT SQL_CACHE $select ";
$sql.="FROM $from " if $from;
$sql.="WHERE $where " if $where;
$sql.="$other" if $other;
my ($c)=$dbh->prepare($sql) or die "Sql has gone to helln";
if(not ($c->execute())) {
my $err=$dbh->errstr;
return undef;
}
my (@r)=$c->fetchrow();
$c->finish();
return @r;
}


Avatar
Patrick Mevzek
un code comme celui ci est il vulnérable ?


Bah comment dire, sans aucun contexte, oui, puisque

sub sqlSelect {
my $select = shift || '';
my $from = shift || '';
my $where = shift || '';
my $other = shift || '';


variables que vous utilisez après coup dans une requête SQL, sans les
vérifier ici.

Comme je ne peux pas deviner ce qu'il y avant, par défaut, c'est
vulnérable.
Si par contre, avant d'appeler sqlSelect vous vérifiez bien tout, c'est
autre chose...

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
Alexandre Jaquet

un code comme celui ci est il vulnérable ?



Bah comment dire, sans aucun contexte, oui, puisque


sub sqlSelect {
my $select = shift || '';
my $from = shift || '';
my $where = shift || '';
my $other = shift || '';



variables que vous utilisez après coup dans une requête SQL, sans les
vérifier ici.

Comme je ne peux pas deviner ce qu'il y avant, par défaut, c'est
vulnérable.
Si par contre, avant d'appeler sqlSelect vous vérifiez bien tout, c'est
autre chose...

Okette donc j utilise $dbh->quote($sql) avant l appel à sqlSelect


merci


Avatar
Alexandre Jaquet


un code comme celui ci est il vulnérable ?




Bah comment dire, sans aucun contexte, oui, puisque


sub sqlSelect {
my $select = shift || '';
my $from = shift || '';
my $where = shift || '';
my $other = shift || '';




variables que vous utilisez après coup dans une requête SQL, sans les
vérifier ici.

Comme je ne peux pas deviner ce qu'il y avant, par défaut, c'est
vulnérable.
Si par contre, avant d'appeler sqlSelect vous vérifiez bien tout, c'est
autre chose...



Okette donc j utilise $dbh->quote($sql) avant l appel à sqlSelect

merci


lorsque j utilise le quoting j ai le msg d erreur suivant :

MySQL server version for the right syntax to use near ''UPDATE wish SET
ref_statut = '3' WHERE ref_user = '1' AND id_wish = '28''

voici le code .

sub sqlUpdate {
my($table, $where, %data)=@_;

my $sql="UPDATE $table SET";

foreach (keys %data) {
if (/^-/) {
s/^-//;
$sql.=" $_ = $data{-$_} " . ",";
} else {
$sql.=" $_ = ".$dbh->quote($data{$_}).",";
}
}
chop($sql);
#print "Content-type: text/htmlnn";
$sql.=" WHERE $where ";
$sql = $dbh->quote ($sql);
#print "$sql";
if(!$dbh->do($sql)) {
my $err=$dbh->errstr;
}
}



Avatar
Paul Gaborit
À (at) Wed, 29 Jun 2005 20:38:54 +0200,
Alexandre Jaquet <""alexjaquet"@[no spam]msn.com"> écrivait (wrote):
lorsque j utilise le quoting j ai le msg d erreur suivant :
MySQL server version for the right syntax to use near ''UPDATE wish SET
ref_statut = '3' WHERE ref_user = '1' AND id_wish = '28''


Vous utilisez deux fois la fonction "quote"... C'est une fois de trop !

voici le code .

sub sqlUpdate {
my($table, $where, %data)=@_;

my $sql="UPDATE $table SET";

foreach (keys %data) {
if (/^-/) {
s/^-//;
$sql.=" $_ = $data{-$_} " . ",";
} else {
$sql.=" $_ = ".$dbh->quote($data{$_}).",";


ici: ^^^^^^^^^^^^^^^^^^^^^^

}
}
chop($sql);
#print "Content-type: text/htmlnn";
$sql.=" WHERE $where ";
$sql = $dbh->quote ($sql);


et là: ^^^^^^^^^^^^^^^^^^^

#print "$sql";
if(!$dbh->do($sql)) {
my $err=$dbh->errstr;
}
}


Vous feriez mieux d'utiliser les "place holder". C'est beaucoup plus propre.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>