if (passage par reference & func_num_args() == possible) { repondez moi; }
8 réponses
bruno
Bonjours, pour ne pas m'ennuyer a lancer mainte fois une fonction, je
voudrait lui passer un nombre variable d'arguments, et qu'elle echappe
les caracteres speciaux.
etant bien entendu faineant, je ne voudrait pas avoir a faire un return
de mon tableau, pour ne pas avoir a faire du coté appelant un gros
liste().
voila, y'a une syntaxe possible pour ca?
voici mon petit bout de code incriminé... :))
function formate () {
$numargs = func_num_args();
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
$numargs[$i] = html_entity_decode($numargs[$i]);
$numargs[$i] = mysql_escape_string ($numargs[$i]);
}
}
la question que je me pose : est-il nescessaire de modifier le tableau $_REQUEST? les valeurs sont elle partagée pat pointeur, ou par valeur??
loufoque
bruno a dit le 26/08/2005 à 16:52:
en fait je procede au debut de mon script a une petite verification :
Quel est l'intérêt de cette vérification ? Produire des données erronées ?
Le html_entity_decode me paraît particulièrement déplacé. Le mysql_escape_string aussi, mais bon, on est habitué à ce genre d'aberrations avec magic_quotes_gpc.
bruno a dit le 26/08/2005 à 16:52:
en fait je procede au debut de mon script a une petite verification :
Quel est l'intérêt de cette vérification ?
Produire des données erronées ?
Le html_entity_decode me paraît particulièrement déplacé. Le
mysql_escape_string aussi, mais bon, on est habitué à ce genre
d'aberrations avec magic_quotes_gpc.
en fait je procede au debut de mon script a une petite verification :
Quel est l'intérêt de cette vérification ? Produire des données erronées ?
Le html_entity_decode me paraît particulièrement déplacé. Le mysql_escape_string aussi, mais bon, on est habitué à ce genre d'aberrations avec magic_quotes_gpc.
bruno
je vait ecrire ces données dans un tableau, en les recuperant d'un formulaire... je ndoit donc faire un reverse engeenering sur les char echapés "a la HTML" non? d'ou le html_entity_decode... ensuite, je doit stocker dans ma base... ne te semble-t-il pas qu'il est mieux d'echapper les " ' ... qui pourraient mettre le bordel dans mes requetes.... bon, le revedrs de la medaille, c'est que je doit les anti-echapper a chaque lecture... mias comment feriez vous? transformer les " en ' et ne mettre que des " pour encadrer les chaines?
je vait ecrire ces données dans un tableau, en les recuperant d'un
formulaire...
je ndoit donc faire un reverse engeenering sur les char echapés "a la
HTML" non?
d'ou le html_entity_decode...
ensuite, je doit stocker dans ma base...
ne te semble-t-il pas qu'il est mieux d'echapper les " ' ... qui
pourraient mettre le bordel dans mes requetes....
bon, le revedrs de la medaille, c'est que je doit les anti-echapper a
chaque lecture...
mias comment feriez vous?
transformer les " en ' et ne mettre que des " pour encadrer
les chaines?
je vait ecrire ces données dans un tableau, en les recuperant d'un formulaire... je ndoit donc faire un reverse engeenering sur les char echapés "a la HTML" non? d'ou le html_entity_decode... ensuite, je doit stocker dans ma base... ne te semble-t-il pas qu'il est mieux d'echapper les " ' ... qui pourraient mettre le bordel dans mes requetes.... bon, le revedrs de la medaille, c'est que je doit les anti-echapper a chaque lecture... mias comment feriez vous? transformer les " en ' et ne mettre que des " pour encadrer les chaines?
loufoque
bruno a dit le 29/08/2005 à 14:38:
je ndoit donc faire un reverse engeenering sur les char echapés "a la HTML" non? d'ou le html_entity_decode...
Pourquoi certains caractères seraient-il échappés "à la HTML" ?
mias comment feriez vous?
Je n'utiliserais mysql_escape_string qu'au moment de créer la requête.
bruno a dit le 29/08/2005 à 14:38:
je ndoit donc faire un reverse engeenering sur les char echapés "a la
HTML" non?
d'ou le html_entity_decode...
Pourquoi certains caractères seraient-il échappés "à la HTML" ?
mias comment feriez vous?
Je n'utiliserais mysql_escape_string qu'au moment de créer la requête.
je ndoit donc faire un reverse engeenering sur les char echapés "a la HTML" non? d'ou le html_entity_decode...
Pourquoi certains caractères seraient-il échappés "à la HTML" ? Car ces chaines sont recupérées en GET ou en POST, donc recuperé
soit a la suite de l'url ( l'espace devient un + ...) pour post je sait pas amis je prend mes precautions...
mias comment feriez vous?
Je n'utiliserais mysql_escape_string qu'au moment de créer la requête. ... je sait... mias l'appli est presque finie... et j'avait oublié :'(
donc j'echappe au debut...
bruno
juste pour info, voila ma version finale :
function echappeChar($tableau) { //on va echapper tous les paramettre entrés, qui ne servent pas au system, onconsidere que ce sont tous des paramettre servant a la BDD : $ignore_list = array("PHPSESSID", "blabla...", "en fait tous les parma servant a la navigation par exemple); foreach ($tableau as $indice => $valeur) { if ( in_array($indice,$ignore_list) ) { } else { if (is_array($valeur) ) { $tableau[$indice] = echappeChar($valeur); } else { $tableau[$indice] = html_entity_decode($valeur); $tableau[$indice] = mysql_real_escape_string ($valeur); } } } return $tableau; }
et je lui passe : $_GET = echappeChar($_GET ) POST et REQUEST
juste pour info, voila ma version finale :
function echappeChar($tableau) {
//on va echapper tous les paramettre entrés, qui ne servent pas au
system, onconsidere que ce sont tous des paramettre servant a la BDD :
$ignore_list = array("PHPSESSID", "blabla...", "en fait tous les parma
servant a la navigation par exemple);
foreach ($tableau as $indice => $valeur) {
if ( in_array($indice,$ignore_list) ) {
} else {
if (is_array($valeur) ) {
$tableau[$indice] = echappeChar($valeur);
} else {
$tableau[$indice] = html_entity_decode($valeur);
$tableau[$indice] = mysql_real_escape_string ($valeur);
}
}
}
return $tableau;
}
et je lui passe :
$_GET = echappeChar($_GET )
POST et REQUEST
function echappeChar($tableau) { //on va echapper tous les paramettre entrés, qui ne servent pas au system, onconsidere que ce sont tous des paramettre servant a la BDD : $ignore_list = array("PHPSESSID", "blabla...", "en fait tous les parma servant a la navigation par exemple); foreach ($tableau as $indice => $valeur) { if ( in_array($indice,$ignore_list) ) { } else { if (is_array($valeur) ) { $tableau[$indice] = echappeChar($valeur); } else { $tableau[$indice] = html_entity_decode($valeur); $tableau[$indice] = mysql_real_escape_string ($valeur); } } } return $tableau; }
et je lui passe : $_GET = echappeChar($_GET ) POST et REQUEST
John GALLET
Bonjour,
juste pour info, voila ma version finale :
Je présume que tu souhaites un feedback. Ne sois pas vexé des remarques, je prends ces 10 minutes à te répondre pour te rendre service et t'expliquer des principes importants, et si tu as des questions après lecture, n'hésite pas à les poser.
Je change un peu l'ordre de ton article pour une approche un peu plus globale.
et je lui passe : $_GET = echappeChar($_GET ) POST et REQUEST
Donc déjà ça veut dire que tu n'as toujours rien compris à l'utilisation de ces variables. Lire le PDF sur www.saphirtech.com/securite.html à ce sujet. Et le cours complet disponible sur le même site au chapitre qui va bien pour plus de détails.
Ensuite, si tu veux modifier le contenu du tableau, il est idiot de le passer en paramètre pour travailler sur une *copie* et ensuite le réaffecter. Et si par dessus le marché tu ne travailles que sur une superglobale, ça frise le ridicule.
//on va echapper tous les paramettre entrés, qui ne servent pas au system, onconsidere que ce sont tous des paramettre servant a la BDD : Oui mais non. Le principe même est mauvais.
$ignore_list = array("PHPSESSID", "blabla...", "en fait tous les parma servant a la navigation par exemple);
Dans cette liste, cite moi un exemple concret de variable qui puisse *normalement, volontairement* contenir du HTML ou des apostrophes. Comment ce types de variables pourrait-il, en utilisation normale, en contenir ? Il va de soit (enfin, pas pour tout le monde) que si un attaquant à l'intention de faire une injection SQL ou une XSS par exemple, lui, il ne va pas se priver de les utiliser pour le faire, donc POURQUOI les exclure du traitement ?
Là ensuite on rentre dans du subjectif. Personnellement j'écrirais ce code la manière suivante.
foreach($tableau as $indice => $valeur) { // NOOP if(in_array($indice,$ignore_list)) continue; // beware of multidimensionnal arrays if (is_array($valeur)) { $tableau[$indice] = echappeChar($valeur); continue; } // Standard value : sanitizing $tableau[$indice] = html_entity_decode($valeur); $tableau[$indice] = mysql_real_escape_string ($valeur); } // end array
Tu remarqueras deux différences entre ta version et la mienne :
- les commentaires, que j'ai écris AVANT de mettre le code, et qui décrivent l'algorithme général: on gère les cas spécifiques, puis on revient dans le cas "normal". - l'absence de if/else/tétrachiée d'accolades dans tous les sens.
Mais je le répète, cette partie est subjective.
a++; JG
Bonjour,
juste pour info, voila ma version finale :
Je présume que tu souhaites un feedback. Ne sois pas vexé des remarques,
je prends ces 10 minutes à te répondre pour te rendre service et
t'expliquer des principes importants, et si tu as des questions après
lecture, n'hésite pas à les poser.
Je change un peu l'ordre de ton article pour une approche un peu plus
globale.
et je lui passe :
$_GET = echappeChar($_GET )
POST et REQUEST
Donc déjà ça veut dire que tu n'as toujours rien compris à l'utilisation
de ces variables. Lire le PDF sur www.saphirtech.com/securite.html à ce
sujet. Et le cours complet disponible sur le même site au chapitre qui
va bien pour plus de détails.
Ensuite, si tu veux modifier le contenu du tableau, il est idiot de le
passer en paramètre pour travailler sur une *copie* et ensuite le
réaffecter. Et si par dessus le marché tu ne travailles que sur une
superglobale, ça frise le ridicule.
//on va echapper tous les paramettre entrés, qui ne servent pas au
system, onconsidere que ce sont tous des paramettre servant a la BDD :
Oui mais non. Le principe même est mauvais.
$ignore_list = array("PHPSESSID", "blabla...", "en fait tous les parma
servant a la navigation par exemple);
Dans cette liste, cite moi un exemple concret de variable qui puisse
*normalement, volontairement* contenir du HTML ou des apostrophes.
Comment ce types de variables pourrait-il, en utilisation normale, en
contenir ?
Il va de soit (enfin, pas pour tout le monde) que si un attaquant à
l'intention de faire une injection SQL ou une XSS par exemple, lui, il
ne va pas se priver de les utiliser pour le faire, donc POURQUOI les
exclure du traitement ?
Là ensuite on rentre dans du subjectif. Personnellement j'écrirais ce
code la manière suivante.
foreach($tableau as $indice => $valeur)
{
// NOOP
if(in_array($indice,$ignore_list)) continue;
// beware of multidimensionnal arrays
if (is_array($valeur))
{
$tableau[$indice] = echappeChar($valeur);
continue;
}
// Standard value : sanitizing
$tableau[$indice] = html_entity_decode($valeur);
$tableau[$indice] = mysql_real_escape_string ($valeur);
} // end array
Tu remarqueras deux différences entre ta version et la mienne :
- les commentaires, que j'ai écris AVANT de mettre le code, et qui
décrivent l'algorithme général: on gère les cas spécifiques, puis on
revient dans le cas "normal".
- l'absence de if/else/tétrachiée d'accolades dans tous les sens.
Je présume que tu souhaites un feedback. Ne sois pas vexé des remarques, je prends ces 10 minutes à te répondre pour te rendre service et t'expliquer des principes importants, et si tu as des questions après lecture, n'hésite pas à les poser.
Je change un peu l'ordre de ton article pour une approche un peu plus globale.
et je lui passe : $_GET = echappeChar($_GET ) POST et REQUEST
Donc déjà ça veut dire que tu n'as toujours rien compris à l'utilisation de ces variables. Lire le PDF sur www.saphirtech.com/securite.html à ce sujet. Et le cours complet disponible sur le même site au chapitre qui va bien pour plus de détails.
Ensuite, si tu veux modifier le contenu du tableau, il est idiot de le passer en paramètre pour travailler sur une *copie* et ensuite le réaffecter. Et si par dessus le marché tu ne travailles que sur une superglobale, ça frise le ridicule.
//on va echapper tous les paramettre entrés, qui ne servent pas au system, onconsidere que ce sont tous des paramettre servant a la BDD : Oui mais non. Le principe même est mauvais.
$ignore_list = array("PHPSESSID", "blabla...", "en fait tous les parma servant a la navigation par exemple);
Dans cette liste, cite moi un exemple concret de variable qui puisse *normalement, volontairement* contenir du HTML ou des apostrophes. Comment ce types de variables pourrait-il, en utilisation normale, en contenir ? Il va de soit (enfin, pas pour tout le monde) que si un attaquant à l'intention de faire une injection SQL ou une XSS par exemple, lui, il ne va pas se priver de les utiliser pour le faire, donc POURQUOI les exclure du traitement ?
Là ensuite on rentre dans du subjectif. Personnellement j'écrirais ce code la manière suivante.
foreach($tableau as $indice => $valeur) { // NOOP if(in_array($indice,$ignore_list)) continue; // beware of multidimensionnal arrays if (is_array($valeur)) { $tableau[$indice] = echappeChar($valeur); continue; } // Standard value : sanitizing $tableau[$indice] = html_entity_decode($valeur); $tableau[$indice] = mysql_real_escape_string ($valeur); } // end array
Tu remarqueras deux différences entre ta version et la mienne :
- les commentaires, que j'ai écris AVANT de mettre le code, et qui décrivent l'algorithme général: on gère les cas spécifiques, puis on revient dans le cas "normal". - l'absence de if/else/tétrachiée d'accolades dans tous les sens.
Mais je le répète, cette partie est subjective.
a++; JG
bruno
Donc déjà ça veut dire que tu n'as toujours rien compris à l'utilisation de ces variables. Lire le PDF sur www.saphirtech.com/securite.html à ce sujet. Et le cours complet disponible sur le même site au chapitre qui va bien pour plus de détails. Mici, si j'ai bien compris, "maintenant" que utiliser REQUEST est bien
mieux, c'est pour ca qu'il est traité, mais le pb... c'est qu'au debut du soft... bein je le conniassait pas, donc je traite GET et POST pour eviter de tout reprogrammer... (des fois c long...)
Ensuite, si tu veux modifier le contenu du tableau, il est idiot de le passer en paramètre pour travailler sur une *copie* et ensuite le réaffecter. Et si par dessus le marché tu ne travailles que sur une superglobale, ça frise le ridicule. d'une , au debut, je travaillait sur le tableau lui meme, mais n'avait
pas pensé aux varialbes tableau passées en param, j'ai donc créé cette fonction recursive. function echappeChar(&$tableau) {...} je n'ai pas trop osé, n'etaint pas au fait de la gestion de php des tableaux contenus dans un tableau (ralentir le soft, ou rallonger le temps de codage??)
$ignore_list = array("PHPSESSID", "blabla...", "en fait tous les parma servant a la navigation par exemple);
Dans cette liste, cite moi un exemple concret de variable qui puisse *normalement, volontairement* contenir du HTML ou des apostrophes. Comment ce types de variables pourrait-il, en utilisation normale, en contenir ? $ignore_list = array("Choix_du_Sdum", "todo",
"toshow","cible","action","PHPSESSID", "sortie"); chez moi, il n'y a pas d'apostrophe, mais des ""... donc autant ne pas les echapper :) (ex : toshow=pagesexemple.php), pour PHPSESSID, je ne le connait pas, je ne sait pas comment il est codé, je l'ai rejouté :))
Il va de soit (enfin, pas pour tout le monde) que si un attaquant à l'intention de faire une injection SQL ou une XSS par exemple, lui, il ne va pas se priver de les utiliser pour le faire, donc POURQUOI les exclure du traitement ? car de mon coté je les utilisent pour la navigation, et jamais elle ne
serviront a faire une injection SQL(ce n'est pas une fonction que je ditribue, mais un bout de code repondant a ma logique applicative et pouvant aider certaines autres personnes a mettre au point un "patch" permettant des injections SQL saines)
Là ensuite on rentre dans du subjectif. Personnellement j'écrirais ce code la manière suivante. Tu remarqueras deux différences entre ta version et la mienne : Mais je le répète, cette partie est subjective.
je suis d'accord avec toi sur la lisibilité de ton recodage :D merci
a++; JG
enfin, je n'ai pas posté ce code afin d'en avoir des retours (enfin un grand merci quand meme) mais juste pour partager. en effet, quand je bloque sur ququchose, mon premier reflexe est une recherche google sur le NG php. comme cette question eatait peu abordée, je me suis dit que je pouvait aider :)
Donc déjà ça veut dire que tu n'as toujours rien compris à l'utilisation
de ces variables. Lire le PDF sur www.saphirtech.com/securite.html à ce
sujet. Et le cours complet disponible sur le même site au chapitre qui
va bien pour plus de détails.
Mici, si j'ai bien compris, "maintenant" que utiliser REQUEST est bien
mieux, c'est pour ca qu'il est traité, mais le pb... c'est qu'au debut
du soft... bein je le conniassait pas, donc je traite GET et POST pour
eviter de tout reprogrammer... (des fois c long...)
Ensuite, si tu veux modifier le contenu du tableau, il est idiot de le
passer en paramètre pour travailler sur une *copie* et ensuite le
réaffecter. Et si par dessus le marché tu ne travailles que sur une
superglobale, ça frise le ridicule.
d'une , au debut, je travaillait sur le tableau lui meme, mais n'avait
pas pensé aux varialbes tableau passées en param, j'ai donc créé
cette fonction recursive.
function echappeChar(&$tableau) {...}
je n'ai pas trop osé, n'etaint pas au fait de la gestion de php des
tableaux contenus dans un tableau (ralentir le soft, ou rallonger le
temps de codage??)
$ignore_list = array("PHPSESSID", "blabla...", "en fait tous les parma
servant a la navigation par exemple);
Dans cette liste, cite moi un exemple concret de variable qui puisse
*normalement, volontairement* contenir du HTML ou des apostrophes.
Comment ce types de variables pourrait-il, en utilisation normale, en
contenir ?
$ignore_list = array("Choix_du_Sdum", "todo",
"toshow","cible","action","PHPSESSID", "sortie");
chez moi, il n'y a pas d'apostrophe, mais des ""... donc autant ne pas
les echapper :)
(ex : toshow=pagesexemple.php), pour PHPSESSID, je ne le connait pas,
je ne sait pas comment il est codé, je l'ai rejouté :))
Il va de soit (enfin, pas pour tout le monde) que si un attaquant à
l'intention de faire une injection SQL ou une XSS par exemple, lui, il
ne va pas se priver de les utiliser pour le faire, donc POURQUOI les
exclure du traitement ?
car de mon coté je les utilisent pour la navigation, et jamais elle ne
serviront a faire une injection SQL(ce n'est pas une fonction que je
ditribue, mais un bout de code repondant a ma logique applicative et
pouvant aider certaines autres personnes a mettre au point un "patch"
permettant des injections SQL saines)
Là ensuite on rentre dans du subjectif. Personnellement j'écrirais ce
code la manière suivante.
Tu remarqueras deux différences entre ta version et la mienne :
Mais je le répète, cette partie est subjective.
je suis d'accord avec toi sur la lisibilité de ton recodage :D merci
a++;
JG
enfin, je n'ai pas posté ce code afin d'en avoir des retours (enfin un
grand merci quand meme) mais juste pour partager. en effet, quand je
bloque sur ququchose, mon premier reflexe est une recherche google sur
le NG php. comme cette question eatait peu abordée, je me suis dit que
je pouvait aider :)
Donc déjà ça veut dire que tu n'as toujours rien compris à l'utilisation de ces variables. Lire le PDF sur www.saphirtech.com/securite.html à ce sujet. Et le cours complet disponible sur le même site au chapitre qui va bien pour plus de détails. Mici, si j'ai bien compris, "maintenant" que utiliser REQUEST est bien
mieux, c'est pour ca qu'il est traité, mais le pb... c'est qu'au debut du soft... bein je le conniassait pas, donc je traite GET et POST pour eviter de tout reprogrammer... (des fois c long...)
Ensuite, si tu veux modifier le contenu du tableau, il est idiot de le passer en paramètre pour travailler sur une *copie* et ensuite le réaffecter. Et si par dessus le marché tu ne travailles que sur une superglobale, ça frise le ridicule. d'une , au debut, je travaillait sur le tableau lui meme, mais n'avait
pas pensé aux varialbes tableau passées en param, j'ai donc créé cette fonction recursive. function echappeChar(&$tableau) {...} je n'ai pas trop osé, n'etaint pas au fait de la gestion de php des tableaux contenus dans un tableau (ralentir le soft, ou rallonger le temps de codage??)
$ignore_list = array("PHPSESSID", "blabla...", "en fait tous les parma servant a la navigation par exemple);
Dans cette liste, cite moi un exemple concret de variable qui puisse *normalement, volontairement* contenir du HTML ou des apostrophes. Comment ce types de variables pourrait-il, en utilisation normale, en contenir ? $ignore_list = array("Choix_du_Sdum", "todo",
"toshow","cible","action","PHPSESSID", "sortie"); chez moi, il n'y a pas d'apostrophe, mais des ""... donc autant ne pas les echapper :) (ex : toshow=pagesexemple.php), pour PHPSESSID, je ne le connait pas, je ne sait pas comment il est codé, je l'ai rejouté :))
Il va de soit (enfin, pas pour tout le monde) que si un attaquant à l'intention de faire une injection SQL ou une XSS par exemple, lui, il ne va pas se priver de les utiliser pour le faire, donc POURQUOI les exclure du traitement ? car de mon coté je les utilisent pour la navigation, et jamais elle ne
serviront a faire une injection SQL(ce n'est pas une fonction que je ditribue, mais un bout de code repondant a ma logique applicative et pouvant aider certaines autres personnes a mettre au point un "patch" permettant des injections SQL saines)
Là ensuite on rentre dans du subjectif. Personnellement j'écrirais ce code la manière suivante. Tu remarqueras deux différences entre ta version et la mienne : Mais je le répète, cette partie est subjective.
je suis d'accord avec toi sur la lisibilité de ton recodage :D merci
a++; JG
enfin, je n'ai pas posté ce code afin d'en avoir des retours (enfin un grand merci quand meme) mais juste pour partager. en effet, quand je bloque sur ququchose, mon premier reflexe est une recherche google sur le NG php. comme cette question eatait peu abordée, je me suis dit que je pouvait aider :)