Mercurial > defr > DualBlog
view comment.php @ 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 | d4f26e9767bf |
children | 217f56e6bc77 |
line wrap: on
line source
<?php require_once("classes.php"); $sk = Factory::getSkeleton(); $id = $_GET['id']; $Data = Factory::getDB(); $Req = new Requete; // Enregistrement éventuel d'un commentaire dans la base de données $Auteur=$Req->get('Auteur'); $Adresse=$Req->get('Adresse'); $AdresseMail = $Req->get('AdresseMail'); $Comment=$Req->get('Comment'); $DateComment=gmdate("Y-m-d H:i:s", time() + 3600*2); // Si on essaie d'ajouter un commentaire et que la graine n'est pas bonne if(!empty($Comment) && $_SESSION['commentSeed'] != $Req->get('seed', null, 't')) die("L'ajout de commentaire doit se faire à partir du formulaire de ce blog"); if(!is_null($Auteur) && $Auteur!='Votre Nom' && $Auteur != $Adresse && !empty($Comment) && strlen($Comment) > 6 && strpos($Comment, 'xanga') === false) { // Prévention d'un "cassage" par ajout d'un commentaire incorrectement formaté $ip = $_SERVER['REMOTE_ADDR']; $Auteur = str_replace(array('<', '>'), array('<', '>'), $Auteur); /* Akismet */ require_once('akismet.class.php'); $comment = array( 'author' => $Auteur, 'email' => $AdresseMail, 'website' => $Adresse, 'body' => $Comment, 'permalink' => 'http://defr.org/blog/posts/' . $id ); $ak = new akismet('http://defr.org/blog', AKISMET_API_KEY, $comment); if(!$ak->errorsExist()) $visibleBool = !$ak->isSpam(); // Suppression d'un gros lourd $visibleBool &= (ereg('^ma[0-9]+zda$', $Auteur) === false); $visible = $visibleBool ? 1 : 0; $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) "); $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)); } // Ajout du post au squelette $Data->Query("SELECT * FROM Mess WHERE num_mess = {$id}"); $row = $Data->GetRow(); $post = new Post($row); $sk->addBlogPost($post->format()); $sk->checkUpdateTime(strtotime($row['DatePost'])); // On définit le titre $sk->setTitle($row['Titre'] . ' - Dual Blog'); // Récupération des commentaires $Data->Query("SELECT * FROM Commentaires Where MessId={$id} AND Visible=1 ORDER BY num_comm"); $defaultGravatar = urlencode(BLOG_DEFAULT_GRAVATAR); while(0 !== ($row = $Data->GetRow())) { $commentTpl = new Template(Skeleton::getTemplateFile('comment')); $dateFormatee = strftime(" à %Hh%M, le %A %d %B %Y", strtotime($row['DateComment'])); $dateFormateeISO = date('c', strtotime($row['DateComment'])); $AdresseMail = $row['AdresseMail']; $grav_id = md5($AdresseMail); $grav_url = 'http://www.gravatar.com/avatar.php?gravatar_id=' . $grav_id . '&size=50&default=' . $defaultGravatar; $Comment = nl2br($row['Comment']); $Comment = str_replace(" & ", " & ", $Comment); $commentFrag = $commentTpl->getDocumentFragment(); $commentFrag->appendXML($Comment); $params = array( '#gravatar@src' => $grav_url, '#auteur@href' => $post->getURL() . '#c' . $row['num_comm'], '#auteur@name' => 'c' . $row['num_comm'], '#auteur' => $row['Auteur'], 'commentDate' => $dateFormatee, 'commentDateISO' => $dateFormateeISO, 'commentNumber' => $row['num_comm'], 'comment' => $commentFrag, ); if(stristr($row['Adresse'], 'http://')) { $params['#auteur@href'] = $row['Adresse']; } $commentTpl->setParams(array_merge($post->getTplParams(), $params)); $sk->addBlogPost($commentTpl); $sk->checkUpdateTime(strtotime($row['DateComment'])); } // Génération de la graine (cette dernière permet de s'assurer // que l'essai d'ajout de commentaire provient bien de ce // formulaire, et en conséquence devrait permettre de réduire // le spam. $seed = md5(time() . 'DualBlog'); $_SESSION['commentSeed'] = $seed; // Ajout du formulaire d'enregistrement de commentaires $commentForm = new Template('commentForm.xml'); $commentForm->setParams(array('#Seed@value' => $seed)); $sk->setParams(array('commentForm' => $commentForm)); echo $sk; ?>