Se protéger injections JAVASCRIPT

Résolu/Fermé
darkchristophetd Messages postés 1100 Date d'inscription mardi 26 février 2008 Statut Contributeur Dernière intervention 14 novembre 2010 - 22 janv. 2009 à 20:52
darkchristophetd Messages postés 1100 Date d'inscription mardi 26 février 2008 Statut Contributeur Dernière intervention 14 novembre 2010 - 28 janv. 2009 à 13:09
Bonjour.
Depuis peu, une personne met des notes négatives et injecte des redirections JS sur mon script de commentaires :
<?php
$moyenne1 = mysql_query("SELECT AVG(note) AS moyenne FROM commentaires") or die (mysql_error());
$moyenne = mysql_fetch_array($moyenne1);
$noteMoyenne = round($moyenne['moyenne'], 2);
echo 'Note moyenne : <b>'.$noteMoyenne.'</b><br /><br />';

//DEBUT DU CODE PHP POUR LES COMMENTAIRES
$page = $_SERVER['SCRIPT_NAME'];

include("../mysql_connect.php");//CHEMIN A MODIFIER SELON LA PAGE
if($_POST['pseudo'] != "" AND $_POST['note'] != "" AND $_POST['commentaire'] != "" AND $_POST['email'] !="" AND preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email']) AND $code == $_SESSION['total'])
{
	$date = date('d/m/Y\- H\:i');
	$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));	
	$note = $_POST['note'] ;	
	$email = mysql_real_escape_string(htmlspecialchars($_POST['email']));
	$commentaire = mysql_real_escape_string($_POST['commentaire']);

	$commentaire = preg_replace('#(.+)#i', '<b>$1</b>', $commentaire);

	$commentaire = preg_replace('#(.+)#i', '<u>$1</u>', $commentaire);

	$commentaire = preg_replace('#(.+)#i', '<i>$1</i>', $commentaire);

	$commentaire = preg_replace('#<barre>(.+)</barre>#i', '<strike>$1</strike>', $commentaire);

	$commentaire = preg_replace('#<centre>(.+)</centre>#i', '<center>$1</center>', $commentaire);

	$commentaire = preg_replace('#;\)#', '<img src="images/clin-oeil.gif" alt="smiley" />', $commentaire);

	$commentaire = preg_replace('#:D#', '<img src="images/grand-sourire.gif" alt="smiley" />', $commentaire);

	$commentaire = preg_replace('#:!:#', '<img src="images/exclamation.gif" alt="smiley" />', $commentaire);

	$commentaire = preg_replace('#=>#', '<img src="images/fleche.gif" alt="smiley" />', $commentaire);

	$commentaire = preg_replace('#:énervé:#', '<img src="images/enerver.gif" alt="smiley" />', $commentaire);

	$commentaire = preg_replace('#:étonné:#', '<img src="iimages/etoner.gif" alt="smiley" />', $commentaire);

	$commentaire = preg_replace('#:diable:#', '<img src="images/diable.gif" alt="smiley" />', $commentaire);

	$commentaire = preg_replace('#:cool:#', '<img src="images/cool.gif" alt="smiley" />', $commentaire);
	
	mysql_query("INSERT INTO commentaires VALUES('', '$date', '$email', '$page', '$pseudo', '$note', '$commentaire')") or die(mysql_error());
	echo'<p>Votre commentaire a bien été ajouté.<br /><br /><br /><br /><br /></p>';
}	


	$reponse = mysql_query("SELECT * FROM commentaires WHERE page='$page' ORDER BY id DESC") or die(mysql_error());
	while($donnees = mysql_fetch_array($reponse))
	{
	/* LE CODE 
	                      HTML EST
						A MODIFIER CI DESSOUS
									 (pour le présentation des coms)
*/	?><br />
	<hr /><br />
	<b><?php echo $donnees['pseudo']?></b> le <?php echo $donnees['date'] ?>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><?php echo $donnees['note'] ?></b> /20 <br />
	<br /><?php echo stripslashes($donnees['commentaire']) ?><br />
    <?php
	}
	?>


<br /><br />
<br /><p>Pour ajouter un commentaire, merci de remplir <b>tous</b> les champs.<br/><br/>
<form name="commentaires" action="<?php echo $page ?>#commentaires" method="POST">
</div>

<label for="pseudo">Pseudo </label>: <input type="text" id="pseudo" name="pseudo" value="<?php echo $_POST['pseudo'] ?>" /><br/><br/>
<label for="email">E-mail(Votre e-mail n'est pas diffusé) </label>: <input type="text" id="email" name="email" value="<?php echo $_POST['email'] ?>" /><br/><br/>
Note : 
<select name="note">
<option value="00">00</option>
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
</select> / 20<br /><br />
<label for="message">Commentaire </label>:
<br />

<div>
        <p>
          <span>
            <input type="button" value="Gras" onclick="insertTag('', '', 'commentaire')" /> 
            <input type="button" value="Souligner" onclick="insertTag('', '', 'commentaire')" /> 
            <input type="button" value="Barrer" onclick="insertTag('<barre>', '</barre>', 'commentaire')" /> 
            <input type="button" value="Italique" onclick="insertTag('', '', 'commentaire')" /> 
            <input type="button" value="Centrer" onclick="insertTag('<centre>', '</centre>', 'commentaire')" /> </br/><br/><br/>
			&nbsp;&nbsp;&nbsp <img src="images/clin-oeil.gif" onclick="insertTag(';)', '', 'commentaire')" /> 
			<img src="images/grand-sourire.gif" onclick="insertTag(':D', '', 'commentaire')" /> 
			<img src="images/exclamation.gif" onclick="insertTag(':!:', '', 'commentaire')"/>
			<img src="images/fleche.gif" onclick="insertTag('=>', '', 'commentaire')"/>
			<img src="images/enerver.gif" onclick="insertTag(':énervé:', '', 'commentaire')"/> 
            <img src="images/etoner.gif" onclick="insertTag(':étonné:', '', 'commentaire')"/> 
        	<img src="images/diable.gif" onclick="insertTag(':diable:', '', 'commentaire')"/> 
			<img src="images/cool.gif" onclick="insertTag(':cool:', '', 'commentaire')"/> 
            
          </span>
        </p>
      </div>
	  <span>
<textarea style="margin-left: 7px; font-size: 1em;" rows="12" cols="50" id="commentaire" name="commentaire">
<?php echo $_POST['commentaire'] ?>
</textarea>
<br /><br />
<u><b>Anti-spam :</b></u><br/><br/>

Entrez ci-dessous le résultat de cette opération mathématique : <?php echo $un ?> + <?php echo $deux ?>


<input type="text" name="code"  style="margin-left: 7px;" value="<?php echo $_POST['code']?>"/><br /><br />
<?php if(isset($_POST['code']) AND $_POST['code'] != $_SESSION['un'] + $_SESSION['deux']){ echo'<span style="color: Red;">Erreur</span>';} ?>
<center><input type="submit" value="Envoyer le commentaire" /></center>
<?php


//FIN DU CODE PHP
?>

Comment le sécuriser ?
merci
A voir également:

4 réponses

Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
25 janv. 2009 à 14:10
Oui oui mais la validation graphique (ta liste de sélection) ne protège pas des envois réalisés sans passer par cette interface.

En fait je t'explique : Le gars, pour envoyer un formulaire invalide, il va enregistrer la page du formulaire sur son disque et modifier celui-ci (il va rajouter manuellement les options négatives). A partir de là, ta validation graphique est totalement rompue et inexistante. A savoir qu'on n'a même pas besoin de passer par les étapes que j'ai décrites pour envoyer un formulaire par POST ; tu peux directement interroger la page PHP en pré-remplissant les valeurs sans passer par aucune interface graphique.

Donc, je le répète, il est indispensable que la validation du formulaire se passe au niveau de la page PHP if($note < 0 || $note > 20) ne valide pas le formulaire, c'est une tentative d'injection manuelle. Ainsi tu dois faire pour tous tes champs, tu ne pourras jamais (au grand jamais) te fier aux limitations de l'interface graphique.
3
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
25 janv. 2009 à 01:15
Bonjour,

Pour empêcher d'encoder une note négative tu peux déjà tester dans ton code PHP que la note envoyée par POST soit dans l'intervalle des notes possibles et pas seulement te limiter au fait que le champ ait été rempli. Ce sera une bonne chose de faite qu'il ne pourra plus contourner. Pour le reste je ne sais pas.
1
darkchristophetd Messages postés 1100 Date d'inscription mardi 26 février 2008 Statut Contributeur Dernière intervention 14 novembre 2010 459
25 janv. 2009 à 07:27
En fait c'est une liste de selection entre 0 et 20.
C'est pour ça que je suis stupéfait que le gars mette -20 o_O
0
darkchristophetd Messages postés 1100 Date d'inscription mardi 26 février 2008 Statut Contributeur Dernière intervention 14 novembre 2010 459
28 janv. 2009 à 13:09
Oui merci mais j'ai aussi pensé à ça.
J'ai enregistré ma page, modifié le <form action="".... en mettant le lien en absolu mais ça ne faisait rien quand on validait...
0