Rappel sur les quotes
Code php :
<?php
$bob = 'toto';
echo '<p>titi</p>\n';
echo '<p>$bob</p>\n';
echo "<p>$bob</p>";
?>
Code html produit :
<p>titi</p>
<p>$bob</p>
<p>toto</p>
Traitement des <input type="checkbox" />
Le code html :
<form action="checkbox.php" method="get">
<p>
<input type="checkbox"
id="check_entree"
name="plats[]"
value="entree"
/>
<label for="check_entree">entrée</label>
<!-- idem pour plat et dessert -->
</p>
<p>
<input type="submit" value="envoyer" />
</p>
</form>
Notez bien les crochets dans l’attribut name
.
Pour le traitement en php,
la fonction liste_plats
, définie par exemple dans le head
de checkbox.php
:
<?php
function liste_plats()
{
$res = '<ul>';
foreach($_REQUEST['plats'] as $plat)
$res .= "<li>$plat</li>\n";
return $res . '</ul>';
}
?>
Le traitement lui-même, dans le body
:
<?php
if(isSet($_REQUEST['plats']))
echo liste_plats();
else
echo '<p>ben vous mangez rien ?</p>'
?>
Voir le résultat : checkbox.html
Cet article est concerné par le concours de hack… (c’est facile)
Puisque c’est facile, je me lance…
Il y a une faille XSS, il faut traiter l’information reçue par $_REQUEST, par exemple dans la fonction liste_plats() :
au lieu de :
$res .= "$plat\n";
il faudrait avoir :
$res .= "" . htmlspecialchars($plat) . "\n";
Voilà ! Bon… j’ai combien de points en plus ? J’en mérite au moins 5 de plus, n’est-ce pas?
bon début
Mais il faut aller plus loin…
Dans un commentaire sur l’article Concours de hack, Thomas explore la direction ouverte par Elisabeth.
Mais ce qu’il suggère n’est manifestement pas l’usage qu’on souhaite autoriser dans cet exemple, donc la faille n’est encore que partiellement corrigée : on veut justement interdire la possibilité que le site affiche autre chose que ce qui est susceptible d’être envoyé par le page html contenant le formulaire.