Discussion:
Aucune recuperation des champs du formulaire
(trop ancien pour répondre)
Guytou77
2008-09-21 16:59:34 UTC
Permalink
Bonjour à Tous,

J'utilise PHP version 5.2.6
Mon script de recuperation de données d'un formulaire ne recupere rien.
Il m'envoie bien un mail mais vide. Voici le contenu du mail que je reçois:

Nom:
E-Mail:
Message:

Aucun champ de mon formulaire n'est recupérée.

Voici mon formulaire (formulaire.html)

<FORM method="POST" action="envoi.php">
<P>Votre nom:<br>
<INPUT type="text" name="nom" size=30>
</p>
<P>Votre adresse E-Mail:<br>
<INPUT type="text" name="email" size=30>
</p>
<P>Message:<br>
<textarea name="message" cols=30 rows=5></textarea>
</p><INPUT type="submit" value="Envoyer">
</FORM>

Voici mon script de recupération et envoie de données du formulaire
(envoi.php):

<?php
$msg = "Nom:\t$nom\n";
$msg .= "E-Mail:\t$email\n";
$msg .= "Message:\t$message\n\n";

$recipient = "***@yahoo.fr";
$subject = "Formulaire";
$mailheaders = "From: Mon test de formulaire<> \n";
$mailheaders .= "Reply-To: $email\n\n";
mail($recipient, $subject, $msg, $mailheaders);

echo "<HTML><HEAD>";
echo "<TITLE>Formulaire envoyer!</TITLE></HEAD><BODY>";
echo "<H1 align=center>Merci, $nom </H1>";
echo "<P align=center>";
echo "Votre formulaire à bien été envoyé !</P>";
echo "</BODY></HTML>";
?>

Merci de m'aider à corriger mon script "envoi.php" pour qu'il recupère
effectivement les données de mon formulaire. Est-ce un problème de
paramettrage
du fichier PHP.ini ? Si oui, quel paramètre à modifier?

Cordialement,

Guytou77
Mickaël Wolff
2008-09-21 20:00:05 UTC
Permalink
Post by Guytou77
du fichier PHP.ini ? Si oui, quel paramètre à modifier?
Il y a plein de raisons de sécurité qui font que ton script ne doit
pas être utilisé. Tu as de la chance de ne pas être un spammeur (à moins
que tu ne le saches pas ;) Les variables HTTP POST sont disponible dans
$_POST. Je t'invite à relire le manuel PHP à ce propos.

Mais surtout, je t'encourage vivement à faire une recherche à propos
du détournement de formulaires.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
CrazyCat
2008-09-22 09:05:53 UTC
Permalink
Post by Guytou77
$msg = "Nom:\t$nom\n";
$msg .= "E-Mail:\t$email\n";
$msg .= "Message:\t$message\n\n";
Merci de m'aider à corriger mon script "envoi.php" pour qu'il recupère
effectivement les données de mon formulaire. Est-ce un problème de
paramettrage
Post by Guytou77
du fichier PHP.ini ? Si oui, quel paramètre à modifier?
Tes variables sont dans $_POST, tu dois donc utiliser $_POST['nom'],
$_POST['email'] et $_POST['message'].

Sinon, tu peux jouer sur register_globals, mais cette fonctionnalité est
obsolète et dangereuse (supprimée dans PHP6)
--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces webmasters : http://www.c-p-f.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Freddy DISSAUX
2008-09-22 12:35:58 UTC
Permalink
Post by Guytou77
Post by Guytou77
$msg = "Nom:\t$nom\n";
$msg .= "E-Mail:\t$email\n";
$msg .= "Message:\t$message\n\n";
Merci de m'aider à corriger mon script "envoi.php" pour qu'il recupère
effectivement les données de mon formulaire. Est-ce un problème de
paramettrage
Post by Guytou77
du fichier PHP.ini ? Si oui, quel paramètre à modifier?
Tes variables sont dans $_POST, tu dois donc utiliser $_POST['nom'],
$_POST['email'] et $_POST['message'].
Sinon, tu peux jouer sur register_globals, mais cette fonctionnalité est
obsolète et dangereuse (supprimée dans PHP6)
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.

Avec un heredoc du plus bel effet:

$msg = <<<EOT;
Nom: {$_REQUEST['nom']}
E-Mail: {$_REQUEST['email']}
Message: {$_REQUEST['message']}


EOT;

Et on n'hésite pas à utiliser filter: http://fr3.php.net/filter
--
freddy <point> dsx <arobase> free <point> fr
CrazyCat
2008-09-22 14:05:45 UTC
Permalink
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
Pour ma part, je considère que c'est une énorme faille que de passer par
$_REQUEST, essentiellement lorsqu'il s'agit de données provenant d'un
formulaire utilisateur.
--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces webmasters : http://www.c-p-f.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Patrick Mevzek
2008-09-22 14:58:58 UTC
Permalink
Post by CrazyCat
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
Pour ma part, je considère que c'est une énorme faille que de passer par
$_REQUEST, essentiellement lorsqu'il s'agit de données provenant d'un
formulaire utilisateur.
Si la sécurité d'une application est uniquement basée sur le fait que
c'est un GET plutôt qu'un POST ou le contraire, alors cette application
n'a aucune réelle mesure de sécurité.

Tous les gens qui croient corriger un problème de sécurité en changeant un
GET par un POST ne comprennent en général pas grand chose au réel problème
de sécurité sous-jacent.

De nombreux autres frameworks ne font pas de différence entre GET et POST
(à juste raison). Ce qui me gêne davantage c'est la présence de $_COOKIE
dans $_REQUEST, et c'est marrant personne ne le mentionne :-)
--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
CrazyCat
2008-09-22 15:24:30 UTC
Permalink
Post by Patrick Mevzek
Post by CrazyCat
Pour ma part, je considère que c'est une énorme faille que de passer par
$_REQUEST, essentiellement lorsqu'il s'agit de données provenant d'un
formulaire utilisateur.
Si la sécurité d'une application est uniquement basée sur le fait que
c'est un GET plutôt qu'un POST ou le contraire, alors cette application
n'a aucune réelle mesure de sécurité.
Je cherche le mot "uniquement" dans ma réponse. Il s'agit d'un simple
premier pas vers un peu plus de sécurité, et je ne parle pas forcément
de protection contre une attaque quelconque.

En utilisant $_REQUEST, on dépend de l'ordre défini dans variables_order
(par défaut Environment, GET, POST, Cookie, Server) et cela peut
engendrer des soucis de fonctionnement sur un site.
Post by Patrick Mevzek
Tous les gens qui croient corriger un problème de sécurité en changeant un
GET par un POST ne comprennent en général pas grand chose au réel problème
de sécurité sous-jacent.
Je recherche aussi le mot "corriger" dans ma réponse.
Post by Patrick Mevzek
De nombreux autres frameworks ne font pas de différence entre GET et POST
(à juste raison). Ce qui me gêne davantage c'est la présence de $_COOKIE
dans $_REQUEST, et c'est marrant personne ne le mentionne :-)
Si la majorité avait raison, ça se saurait.
--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces webmasters : http://www.c-p-f.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Olivier Miakinen
2008-09-22 15:55:15 UTC
Permalink
Post by CrazyCat
Post by Patrick Mevzek
Si la sécurité d'une application est uniquement basée sur le fait que
c'est un GET plutôt qu'un POST ou le contraire, alors cette application
n'a aucune réelle mesure de sécurité.
Je cherche le mot "uniquement" dans ma réponse. Il s'agit d'un simple
premier pas vers un peu plus de sécurité, et je ne parle pas forcément
de protection contre une attaque quelconque.
Le mot-clé, c'est « fausse impression de sécurité ». Si on a besoin de
restreindre la lecture des données externes à $_POST pour augmenter la
sécurité, fût-ce d'un millionième de chouia, c'est que le contrôle sur
les valeurs n'est pas suffisant.
Post by CrazyCat
En utilisant $_REQUEST, on dépend de l'ordre défini dans variables_order
(par défaut Environment, GET, POST, Cookie, Server) et cela peut
engendrer des soucis de fonctionnement sur un site.
Ça c'est un autre problème, qui n'arrivera que si l'ordre est modifié et
que le programmeur donne un nom identique à, par exemple, un cookie et
une entrée de formulaire. Cela dit, tu as raison, si le cas arrive cela
peut engendrer des bugs (plutôt que des problèmes de sécurité, car là
encore ce n'est pas parce qu'une variable peut être envoyée via un
cookie qu'elle est plus dangereuse que transmise via un post).
Patrick Mevzek
2008-09-22 16:26:10 UTC
Permalink
Post by CrazyCat
Post by Patrick Mevzek
Post by CrazyCat
Pour ma part, je considère que c'est une énorme faille que de passer par
$_REQUEST, essentiellement lorsqu'il s'agit de données provenant d'un
formulaire utilisateur.
Si la sécurité d'une application est uniquement basée sur le fait que
c'est un GET plutôt qu'un POST ou le contraire, alors cette application
n'a aucune réelle mesure de sécurité.
Je cherche le mot "uniquement" dans ma réponse. Il s'agit d'un simple
premier pas vers un peu plus de sécurité,
C'est (presque) pire alors. Croire qu'un tel pas augmente la sécurité
prouve qu'on ne fait pas(!) des pas dans la bonne direction, et il est donc
probable que les suivants soient du même (mauvais) tonneau. En
investissant de l'énergie aux mauvais endroits, a priori, on ne le fait
pas aux bons.

C'est ne pas comprendre le coeur du problème (certes pas trivial), à
savoir le changement de contexte, et que ce n'est pas comment ce
changement intervient qui importe (le transport du contenu) mais sa seule
survenue.

Bref, c'est ne pas avoir, selon moi, le bon état d'esprit pour analyser
les problèmes de sécurité, en particulier sur le web.
Post by CrazyCat
et je ne parle pas forcément de protection contre une attaque quelconque.
« énorme faille » se rapporte à quoi alors ?
Post by CrazyCat
En utilisant $_REQUEST, on dépend de l'ordre défini dans variables_order
(par défaut Environment, GET, POST, Cookie, Server) et cela peut
engendrer des soucis de fonctionnement sur un site.
Sauf que dans $_REQUEST, il n'y a que GET, POST, et COOKIE, déjà.
De ce point de vue là au moins c'est homogène, on sait que *tout* ce qu'il
y a la-dedans est dangereux, sans exception, et
si on filtre on est sûr de filtrer quel que soit le mécanisme. Alors que
si on décide de ne filtrer que GET ou que POST ou que COOKIE eh bien on
oublie la « big picture » et on se fera avoir un jour au l'autre par une
faille (de sécurité)

Si il y a mélange entre les trois, on a affaire à un problème de sécurité
bien plus grand je pense, juste d'une application mal développée dès le
départ (si elle se prend les pieds avec le nommage de ses variables,
internes ou externes, je pense que ca s'en ressentira rapidement sur les
fonctionnalités et le nombre de bugs). Même si cela peut arriver, je trouve
ce problème bien moindre que de croire que vérifier que REQUEST_METHOD =
POST solutionne tout (à voir comment un post qui dit le contraire déchaine
les passions avec 3 réponses unanimes dans les 2 heures).
D'autre part on risque de s'en apercevoir (« ca ne marche pas») alors
qu'on croira dormir sur ses 2 oreilles avec son test bidon sur la méthode,
sans penser un seul instant qu'on ne solutionne en réalité pas grand chose.
Post by CrazyCat
Post by Patrick Mevzek
Tous les gens qui croient corriger un problème de sécurité en changeant
un GET par un POST ne comprennent en général pas grand chose au réel
problème de sécurité sous-jacent.
Je recherche aussi le mot "corriger" dans ma réponse.
Vous vous sentiez visé explicitement par ma phrase alors :-) ?
Ce n'était pourtant pas le but.

Je faisais juste état des fausses bonnes réponses qu'on lit à longueur de
forum ou de pages web...
Post by CrazyCat
Post by Patrick Mevzek
De nombreux autres frameworks ne font pas de différence entre GET et
POST (à juste raison). Ce qui me gêne davantage c'est la présence de
$_COOKIE dans $_REQUEST, et c'est marrant personne ne le mentionne :-)
Si la majorité avait raison, ça se saurait.
Je cherche le mot « majorité » dans ma réponse.

Mais donc sinon merci de confirmer que la majorité (notamment ici) qui
croit que POST/GET c'est mieux que REQUEST, n'a pas raison :-)
--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Pascal PONCET
2008-09-22 14:05:45 UTC
Permalink
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
...
Et on n'hésite pas à utiliser filter: http://fr3.php.net/filter
Bonjour,
Je pense que l'utilisation de $_REQUEST n'est pas cohérente avec celle
de l'extension "filter", ou toute autre technique de filtrage et de
validation.
En effet, si l'on tient à sécuriser les données issues des clients HTTP,
ce qui est hautement conseillé, on considérera également qu'il convient
de tester leur méthode d'envoi, par GET ou par POST.
Voir à ce sujet les recommandations de l'OWASP (www.owasp.org).
Cordialement,
Pascal
Patrick Mevzek
2008-09-22 15:01:49 UTC
Permalink
Post by Pascal PONCET
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
...
Et on n'hésite pas à utiliser filter: http://fr3.php.net/filter
Je pense que l'utilisation de $_REQUEST n'est pas cohérente avec celle
de l'extension "filter", ou toute autre technique de filtrage et de
validation.
Deux choses complétement orthogonales.
Post by Pascal PONCET
En effet, si l'on tient à sécuriser les données issues des clients HTTP,
ce qui est hautement conseillé, on considérera également qu'il convient
de tester leur méthode d'envoi, par GET ou par POST.
Il suffit donc de tester $_SERVER['REQUEST_METHOD']
si c'est réellement nécessaire.
Aucun rapport avec l'usage de $_REQUEST.

Mais autant espérer que la sécurité de l'application ne dépende pas de
cela, sans quoi...
Post by Pascal PONCET
Voir à ce sujet les recommandations de l'OWASP (www.owasp.org).
Quelles sont celles qui interdisent l'usage de $_REQUEST ?
--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Pascal PONCET
2008-09-22 15:57:36 UTC
Permalink
Post by Patrick Mevzek
Post by Pascal PONCET
Voir à ce sujet les recommandations de l'OWASP (www.owasp.org).
Quelles sont celles qui interdisent l'usage de $_REQUEST ?
Waouhhh...susceptible, l'animal !
Non, rien ne l'interdit, bien sûr, il ne s'agit que de simples
recommandations.
De plus, elles restent discutables, d'où l'objet d'un forum.
Question bête, tant que j'y suis : peut-on utiliser le type REQUEST dans
les fonctions de l'extension "filter" ? ;-)
Mickaël Wolff
2008-09-22 14:05:45 UTC
Permalink
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
C'est que tu n'as pas compris la différence sémantique entre HTTP GET
et HTTP POST, ni les implications en terme de sécurité que cela implique.
Post by Freddy DISSAUX
$msg = <<<EOT;
Nom: {$_REQUEST['nom']}
E-Mail: {$_REQUEST['email']}
Message: {$_REQUEST['message']}
EOT;
Comme au bon vieux temps du global_register.
Post by Freddy DISSAUX
Et on n'hésite pas à utiliser filter: http://fr3.php.net/filter
Certes, la seule bonne idée du message.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Olivier Miakinen
2008-09-22 14:53:06 UTC
Permalink
Post by Mickaël Wolff
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
C'est que tu n'as pas compris la différence sémantique entre HTTP GET
et HTTP POST, ni les implications en terme de sécurité que cela implique.
Tiens, un marronnier...

Bon. Qu'il y ait une différence sémantique entre HTTP GET et HTTP POST,
c'est une chose. Mais en ce qui concerne les implications en terme de
sécurité, sachant qu'un attaquant peut envoyer aussi facilement un POST
qu'un GET, je trouve que c'est presque mieux d'utiliser $_REQUEST, si
cela incite à vérifier d'autant mieux le *contenu* des variables plutôt
que leur *provenance*.
Post by Mickaël Wolff
Post by Freddy DISSAUX
$msg = <<<EOT;
Nom: {$_REQUEST['nom']}
E-Mail: {$_REQUEST['email']}
Message: {$_REQUEST['message']}
EOT;
Comme au bon vieux temps du global_register.
Là je suis d'accord qu'il y a potentiellement un problème si la commande
mail est sensible aux « buffer overflows » ou à l'envoi de caractères de
contrôle dans le corps du message : il faudrait soigneusement vérifier
chaque paramètre. Cela dit, mettre $_REQUEST['email'] dans $msg, c'est
quand même beaucoup moins risqué que de le mettre dans $mailheaders
comme le faisait Guytou77.
Post by Mickaël Wolff
Post by Freddy DISSAUX
Et on n'hésite pas à utiliser filter: http://fr3.php.net/filter
Certes, la seule bonne idée du message.
Oh, mais c'est génial, ça ! Ça faisait longtemps que John Gallet
regrettait que ça n'existe pas en standard, mais je vois que tout finit
par arriver.
Patrick Mevzek
2008-09-22 15:24:30 UTC
Permalink
Post by Olivier Miakinen
je trouve que c'est presque mieux d'utiliser $_REQUEST, si
cela incite à vérifier d'autant mieux le *contenu* des variables plutôt
que leur *provenance*.
Tout à fait !
D'autant que leur provenance est connue, elles viennent de l'extérieur, ce
monde hostile qu'est Internet, et donc qu'elles soient transmises en POST
ou en GET, elles sont autant dangereuses, et doivent être traitées
toujours avec la même circonspection.

BTW, cela ne viendrait à l'idée de personne d'avoir 2 méthodes différentes
d'accès au données selon que ce soit un
POST application/x-www-form-urlencoded
ou un
POST multipart/form-data
alors que pourtant les deux sont très différents.

[filter]
Post by Olivier Miakinen
Oh, mais c'est génial, ça ! Ça faisait longtemps que John Gallet
regrettait que ça n'existe pas en standard, mais je vois que tout finit
par arriver.
Pour moi ce qui serait encore mieux (peut-être cela existe) c'est
l'équivalent d'un « anti register_global » à la façon du « tainting » en
Perl : la possibilité d'accoler une étiquette « sûr / pas sûr » sur chaque
variable avec un étiquetage automatique « pas sûr » sur toutes les
variables construites directement et déduites d'informations venant de
l'extérieur du programme (donc dans un premier temps le User-agent, puis
aussi éventuellement l'OS/le serveur Web et les sources de données externes
au programme mais internes au système comme les bases de données) et un
interpréteur qui s'arrête immédiatement sur toutes les opérations
dangereuses (open, system, etc.) se faisant avec des variables étiquettées
« non sûr ».
--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Mickael Wolff
2008-09-22 16:26:10 UTC
Permalink
Post by Olivier Miakinen
Là je suis d'accord qu'il y a potentiellement un problème si la commande
mail est sensible aux « buffer overflows » ou à l'envoi de caractères de
contrôle dans le corps du message : il faudrait soigneusement vérifier
chaque paramètre. Cela dit, mettre $_REQUEST['email'] dans $msg, c'est
quand même beaucoup moins risqué que de le mettre dans $mailheaders
comme le faisait Guytou77.
La difficulté n'est pas d'envoyer un HTTP GET ou un HTTP POST, mais
de faire en sorte qu'un internaute envoie une requête à l'aide de ces
droits d'accès.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Freddy DISSAUX
2008-09-22 17:44:47 UTC
Permalink
Post by Olivier Miakinen
Post by Mickaël Wolff
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
C'est que tu n'as pas compris la différence sémantique entre HTTP GET
et HTTP POST, ni les implications en terme de sécurité que cela implique.
Tiens, un marronnier...
Oui, je sais, j'ai marché dedans :)

Le but premier de mon post était d'évoquer l'utilisation de filter +
heredoc + simplification avec $_REQUEST. C'est vrai qu'à la relecture ce
n'est pas évident.

Mais je trouve que:
- filter n'est vraiment pas assez utilisé
- les heredoc ne sont pas assez utilisés (quelle plaie ces interminables
concaténation !)
- on se simplifie un peu le debug avec $_REQUEST (et le premier qui n'a
jamais tripoté une url dans son navigateur me jette la première pierre
:)
--
freddy <point> dsx <arobase> free <point> fr
Patrick Mevzek
2008-09-22 14:58:58 UTC
Permalink
Post by Mickaël Wolff
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
C'est que tu n'as pas compris la différence sémantique entre HTTP GET
et HTTP POST,
S'il y a certes une différence sémantique, elle n'a pas à influer sur la
façon de récupérer les paramètres envoyés par l'utilisateur, et
l'application peut tout à fait savoir par différents moyens si elle est
dans le cas d'un GET ou d'un POST.
Post by Mickaël Wolff
ni les implications en terme de sécurité que cela implique.
Une application dont la sécurité ne dépend que de l'usage d'une méthode
HTTP plutôt que d'une autre est une application sans réelle sécurité.
Post by Mickaël Wolff
Post by Freddy DISSAUX
$msg = <<<EOT;
Nom: {$_REQUEST['nom']}
E-Mail: {$_REQUEST['email']}
Message: {$_REQUEST['message']}
EOT;
Comme au bon vieux temps du global_register.
Absolument pas, puisque l'espace de nommage est différent : $toto vs
$_REQUEST['toto']
Aucun risque d'utiliser $_REQUEST['toto'] par inadvertance dans un bout du
code comme variable « locale » (non dépendante de l'extérieure.

La fausse bonne idée du register_global était de mettre dans le même
espace de noms deux jeux de variables qui doivent rester séparé, car sinon
il y a changement de contexte et comme je dis à mes étudiants, changement
de contexte implique risque de sécurité (pas nécessairement faille de
sécurité mais ca doit faire sonner une alarme et obliger à faire attention)
--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Mickael Wolff
2008-09-22 16:26:10 UTC
Permalink
Post by Patrick Mevzek
S'il y a certes une différence sémantique, elle n'a pas à influer sur la
façon de récupérer les paramètres envoyés par l'utilisateur,
Pourquoi, alors que ce sont deux concepts différents ?
Post by Patrick Mevzek
et
l'application peut tout à fait savoir par différents moyens si elle est
dans le cas d'un GET ou d'un POST.
Non. Parce que les deux peuvent survenir en même temps.

<form action="article.php?id=12" method='post'>
<p>
<input type='hidden' name='action' value='delete' />
<!-- la valeur du bouton peut dépendre de la localisation
on utilises donc un champ caché d'action -->
<input type='submit' value='Supprimer'/>
</p>
</form>

Si on considère que $_REQUEST['action'], alors il est possible pour
un attaquant de proposer le lien <article.php?id=12&action=delete> Alors
je suis d'accord que l'internaute devrait faire attention à ce qu'il
clique, mais un mécanisme minimal de sécurité est de considérer
$_POST['action']. Ensuite on peut bien sûr améliorer la sécurité avec un
système de jeton, si vraiment il faut blinder, surtout si les
utilisateurs utilisent un navigateur peut sûr permettant de faire des
requêtes HTTP croisées avec un XHR (et donc de faire le POST qui va bien).
Post by Patrick Mevzek
Post by Mickaël Wolff
ni les implications en terme de sécurité que cela implique.
Une application dont la sécurité ne dépend que de l'usage d'une méthode
HTTP plutôt que d'une autre est une application sans réelle sécurité.
La sécurité est un ensemble de bonnes pratiques. Par exemple, pour
supprimer un article, il est souhaitable que le paramètre conduisant à
la suppression ne puisse pas être considéré s'il est un HTTP GET. Sinon,
un lien dans un courriel frauduleux, ou dans un site piégé, pourrait
conduire à des suppressions ciblées. C'est le genre de trous qui sont
souvent présents dans les panels d'administration. On considère que
puisqu'il y a un cookie, la requête est légitime, alors que non.
Post by Patrick Mevzek
Absolument pas, puisque l'espace de nommage est différent : $toto vs
$_REQUEST['toto']
Aucun risque d'utiliser $_REQUEST['toto'] par inadvertance dans un bout du
code comme variable « locale » (non dépendante de l'extérieure.
J'y vais certes un peu fort. Mais utiliser des données directement
venant de n'importe où me fait toujours sortir de mes gonds.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Patrick Mevzek
2008-09-22 17:09:42 UTC
Permalink
Post by Mickael Wolff
Post by Patrick Mevzek
S'il y a certes une différence sémantique, elle n'a pas à influer sur la
façon de récupérer les paramètres envoyés par l'utilisateur,
Pourquoi, alors que ce sont deux concepts différents ?
Il ne vous aura pas échappé qu'à l'endroit où ces méthodes sont définies,
à savoir dans le RFC du protocole HTTP, protocole qui est un protocole de
*transport* d'information (comme le signifie le deuxième T), il n'y a pas
lieu de s'occuper de comment cela est géré côté serveur, parce que ce sont
(le transport vers le serveur, et la gestion interne du serveur et des
applications subordonnées) deux choses complétement décorrelées.

Si ce sont deux concepts différents, on peut s'amuser à tester
$_SERVER['REQUEST_METHOD']. Après quoi, je ne vois pas pourquoi dans le
code il faudrait un cas spécifique à une méthode et un cas spécifique à
une autre. Avoir une seule API et une abstraction simplifie souvent les
choses (tant qu'on comprend bien ce qui se passe « en-dessous »)
Post by Mickael Wolff
Post by Patrick Mevzek
et
l'application peut tout à fait savoir par différents moyens si elle est
dans le cas d'un GET ou d'un POST.
Non. Parce que les deux peuvent survenir en même temps.
<form action="article.php?id=12" method='post'>
^^^^^^^^^^^^^

Non, pas en même temps, la preuve vous faites un POST là. Pas un GET.
Lancez un sniffeur, vous verrez bien votre navigateur faire un POST ou
serveur. Pas un POST et un GET en même temps, non juste un POST. Donc la
méthode ici est POST, point final.

Maintenant, si l'application est concue n'importe comment, c'est un autre
problème.

C'est peut-être un point non/mal spécifié dans la norme, mais c'est
clairement quelque chose qui n'a pas lieu d'être (on ne gagne rien à
?id=12 vs input type=hidden name=id value=12 si ce n'est quelques
caractères, si on est radin on pourrait même exploiter quelque chose
d'assez peu connu, le PATH_INFO, et faire action="article.php/id=12"). Je
ne vois pas pourquoi, sous prétexte d'applications mal concues, il
faudrait bâtardiser l'API pour le reste du monde...

À noter que je connais au moins une API (que je trouve sensée) qui, dans
le cas que vous donnez, ne prendrez pas du tout en compte le ?id=12 qui ne
serait pas visible du programme (sauf à bidouiller explicatement dans la
variable d'environnement QUERY_STRING évidemment). On en revient alors à
ce que je disais dans un autre message : le développeur s'apercevrait
immédiatement que cela ne marche pas (le id étant perdu dans la bagarre)
et changerait donc son code pour faire quelque chose qui marche (mettre le
id en champ caché).

Il est clair que sinon effectivement à faire de baisser la barrière
d'entrée et d'accepter tout et n'importe quoi au simple motif de faciliter
la vie des gens qui ne veulent surtout pas réfléchir mais juste que « ca
marche » eh bien on en arrive à des catastrophes (merci register_global et
autres bourdes du même tonneau)
Post by Mickael Wolff
<p>
<input type='hidden' name='action' value='delete' /> <!-- la
valeur du bouton peut dépendre de la localisation
on utilises donc un champ caché d'action -->
<input type='submit' value='Supprimer'/>
</p>
</form>
Si on considère que $_REQUEST['action'], alors il est possible pour
un attaquant de proposer le lien <article.php?id=12&action=delete>
Et alors ?
Si vous utilisez $_POST['action'], l'attaquant peut tout aussi bien
bidouiller le formulaire et ajouter un champ caché. Donc même résultat.
Ce n'est pas utiliser $_POST['action'] à la place de $_REQUEST['action']
qui va bloquer un attaquant...
Post by Mickael Wolff
Alors
je suis d'accord que l'internaute devrait faire attention à ce qu'il
clique, mais un mécanisme minimal de sécurité est de considérer
$_POST['action'].
Non, cela n'apporte AUCUNE sécurité.
Post by Mickael Wolff
Ensuite on peut bien sûr améliorer la sécurité avec un
système de jeton, si vraiment il faut blinder, surtout si les
On ne met pas de pansements sur des jambes de bois...
Post by Mickael Wolff
Post by Patrick Mevzek
Post by Mickaël Wolff
ni les implications en terme de sécurité que cela implique.
Une application dont la sécurité ne dépend que de l'usage d'une méthode
HTTP plutôt que d'une autre est une application sans réelle sécurité.
La sécurité est un ensemble de bonnes pratiques.
C'est aussi celle de l'élément le plus faible du chaînon. Si c'est dernier
tient en la croyance que $_REQUEST c'est mal et qu'en prenant $_POST je
suis sauf, alors la sécurité globale est bien faible...
Elle est même « négative » selon moi dans le sens où avoir l'impression de
sécurité est encore pire que pas de sécurité du tout.
Post by Mickael Wolff
Par exemple, pour
supprimer un article, il est souhaitable que le paramètre conduisant à
la suppression ne puisse pas être considéré s'il est un HTTP GET.
Ce n'est pas la façon dont une variable est transportée qui doit
déterminer une mesure de sécurité.
Ca serait comme dire : si je recois un courrier via Chronopost je ne le
lis pas de la même façon que si je le reçois par la poste normale. Bah
non, le *contenu* de la lettre peut être le même, dangereux ou pas,
quelque soit l'enveloppe et la façon de l'acheminer.

Après vous mélangez la-dedans de la sémantique, qui est encore un autre
problème.
Post by Mickael Wolff
Sinon,
un lien dans un courriel frauduleux, ou dans un site piégé, pourrait
conduire à des suppressions ciblées.
Idem avec un POST (dans un site piégé, voire dans un email si on a le
droit au javascript ou aux formulaires)
Post by Mickael Wolff
C'est le genre de trous qui sont
souvent présents dans les panels d'administration.
Je doute que ce soit des modèles de sécurité...
Post by Mickael Wolff
Post by Patrick Mevzek
Absolument pas, puisque l'espace de nommage est différent : $toto vs
$_REQUEST['toto']
Aucun risque d'utiliser $_REQUEST['toto'] par inadvertance dans un bout
du code comme variable « locale » (non dépendante de l'extérieure.
J'y vais certes un peu fort. Mais utiliser des données directement
venant de n'importe où me fait toujours sortir de mes gonds.
Certes, et sur ce point nous sommes d'accord. Mais cela n'a donc rien à
voir avec *comment* on accède à ces données, que ce soit un tableau appelé
POST ou un tableau appelé GET (les données viennent de « n'importe où »
dans les deux cas).
--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Antoine
2008-09-23 06:21:58 UTC
Permalink
Post by Patrick Mevzek
Certes, et sur ce point nous sommes d'accord. Mais cela n'a donc
rien à voir avec *comment* on accède à ces données, que ce soit un
tableau appelé POST ou un tableau appelé GET (les données viennent
de « n'importe où » dans les deux cas).
Merci pour toutes explications.

Si on résume : en termes de sécurité, on se moque de savoir si
l'appel d'un script est en POST ou en GET, ce qui compte c'est le
contrôle des données en entrée (nombre, type, valeur) en absolu
d'une part et relativement à l'environnement courant (utilisateur
identifié, etc) d'autre part, non ?
--
Antoine
Michael DENIS
2008-09-23 06:21:58 UTC
Permalink
Post by Patrick Mevzek
Ce n'est pas la façon dont une variable est transportée qui doit
déterminer une mesure de sécurité.
Je vous rejoins là-dessus. En revanche, si la façon dont la variable est
transportée n'est pas conforme à ce qui était prévu, c'est déjà un
problème avant même de savoir ce qu'elle contient. Et je pense que c'est
là l'intérêt d'utiliser $_GET ou $_POST plutôt que $_REQUEST (ou de
vérifier la méthode de transport). Mais ce n'est qu'une vérification
supplémentaire, et, nous sommes bien d'accord, pas du tout une mesure de
sécurité suffisante.
Post by Patrick Mevzek
Ca serait comme dire : si je recois un courrier via Chronopost je ne le
lis pas de la même façon que si je le reçois par la poste normale.
Non, ce serait comme dire: si j'attends un courrier par Chronopost et
qu'il arrive par la poste normale, c'est qu'il y a une anomalie. Et
avant même de savoir ce qu'il contient, je pourrais éventuellement
décider de ne pas l'ouvrir (un peu bizarre dans le cas d'un courrier,
mais c'est pour l'exemple :-)). C'est, encore une fois, une vérification
préalable et complémentaire, pas suffisante.
--
Michaël DENIS
Freddy DISSAUX
2008-09-22 15:55:15 UTC
Permalink
Post by Mickaël Wolff
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
C'est que tu n'as pas compris la différence sémantique entre HTTP GET
et HTTP POST, ni les implications en terme de sécurité que cela implique.
La diférence sémantique entre GET et POST aura une importance le jour on
on aura aussi PUT, DELETE et CONNECT. Pour l'instant, très peu de REST à
l'horizon :)

Quant aux implications en termes de sécurité, qu'une donnée arrive par
GET ou POST, il faut qu'elle soit validée (à coup de filter ou autre)
et à partir de là, utiliser GET&POST / REQUEST n'a plus trop
d'importance.
Post by Mickaël Wolff
Post by Freddy DISSAUX
$msg = <<<EOT;
Nom: {$_REQUEST['nom']}
E-Mail: {$_REQUEST['email']}
Message: {$_REQUEST['message']}
EOT;
Comme au bon vieux temps du global_register.
Je me répète, une fois passé le validateur, pas de problème pour moi.
Post by Mickaël Wolff
Post by Freddy DISSAUX
Et on n'hésite pas à utiliser filter: http://fr3.php.net/filter
Certes, la seule bonne idée du message.
Merci.
--
freddy <point> dsx <arobase> free <point> fr
Bruno Desthuilliers
2008-09-22 22:05:57 UTC
Permalink
Post by Freddy DISSAUX
Post by Mickaël Wolff
Post by Freddy DISSAUX
Personnellement, je recommande chaudement l'utilisation de $_REQUEST
pour éviter les mélimélo $_GET/$_POST.
C'est que tu n'as pas compris la différence sémantique entre HTTP GET
et HTTP POST, ni les implications en terme de sécurité que cela implique.
La diférence sémantique entre GET et POST aura une importance le jour on
on aura aussi PUT, DELETE et CONNECT. Pour l'instant, très peu de REST à
l'horizon :)
Hélas... Mais bon, la différence n'en reste pas moins réelle du point de
vue sémantique, et vu l'ignorance moyenne du protocole http par les
développeurs web, il n'est pas forcément inutile de la rappeler (la
différence...) - même si l'argument de la sécurité est effectivement ici
plus que discutable.
Post by Freddy DISSAUX
Quant aux implications en termes de sécurité, qu'une donnée arrive par
GET ou POST, il faut qu'elle soit validée (à coup de filter ou autre)
et à partir de là, utiliser GET&POST / REQUEST n'a plus trop
d'importance.
Là encore, ça ne fait en effet guère de différence du point de vue de la
sécurité. Par contre, utiliser explicitement $_GET ou $_POST (ou
$_COOKIE etc) permet de 1/ documenter ce qui est attendu et 2/ de
détecter plus facilement des horreurs tels que des liens (GET) sur une
action non idempotente. Bref, si ça ne change rien du point de vue de la
sécurité, ça peut au moins avoir un impact sur la lisibilité du code, la
robustesse de l'application, et l'éducation des développeurs...

(snip)
Continuer la lecture sur narkive:
Loading...