changeset 71:464f4b94ee27

Filtrage de certaines balises HTML, meilleure détection de la validité XML. Plusieurs choses en une, toute tournant autour d'un meilleur traitement du commentaire soumis: - on utilise désormais stripslashes pour correctement gérer la valeur d'éventuels arguments - on filtre, via le DOM, les balises qui pourraient s'avérer peut sure, ou être utilisé pour une attaque de type cross-site scripting. L'utilisation de getElementsByTagName devrait se charger d'attaque du type <html:script /> ou l'utilisateur utilise un namespace non standard pour déjouer une comparaison de chaînes.
author Franck Deroche <webmaster@defr.org>
date Thu, 20 Mar 2008 19:45:08 +0100
parents e08186e4ed77
children 217f56e6bc77
files comment.php
diffstat 1 files changed, 19 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/comment.php	Wed Mar 19 12:08:15 2008 +0100
+++ b/comment.php	Thu Mar 20 19:45:08 2008 +0100
@@ -39,7 +39,25 @@
 	$visibleBool &= (ereg('^ma[0-9]+zda$', $Auteur) === false);
         $visible = $visibleBool ? 1 : 0;
 
-	if(DOMDocument::loadXML('<comment>' . $Comment . '</comment>')) {
+	$doc = @DOMDocument::loadXML('<comment>' . stripslashes($Comment) . '</comment>');
+	// Si le post est conforme XML, on recherche des balises indésirables
+	if($doc)
+	{
+		$bannedTags = array('script', 'object', 'iframe');
+		foreach($bannedTags as $tagName)
+		{
+			$nl = $doc->getElementsByTagName($tagName);
+			if($nl->length > 0)
+			{
+				$Comment = htmlspecialchars($Comment);
+				break;
+			}
+		}
+	}
+	// Sinon le post n'est pas conforme XML, on supprime toute balise
+	else
+		$Comment = htmlspecialchars($Comment);
+	
 	$Data->debugQuery("
 		INSERT INTO Commentaires(MessId, Auteur, Adresse, AdresseMail, Comment, DateComment, ip, Visible)
 		VALUES({$id}, '{$Auteur}', '{$Adresse}', '{$AdresseMail}', '{$Comment}', '{$DateComment}', '{$ip}', $visible)
@@ -47,10 +65,6 @@
 	$Data->Query("UPDATE Mess SET NbCommentaires=NbCommentaires+1 WHERE num_mess={$id}");
 	if($visibleBool)
 		mail(ADMIN_MAIL, 'Nouveau commentaire de ' . $Auteur, $Auteur . " vient de mettre en ligne le commentaire suivant:  \n" . wordwrap($Comment, 70));
-	}
-	else {
-		$infos = 'Votre commentaire doit etre fait de XML valide pour apparaitre.';
-	}
       }
 
      // Ajout du post au squelette