view comment.php @ 84:0b635e3ae1a1

comment.php: Suppression de règles de ban peu précises
author Franck Deroche <franck@defr.org>
date Fri, 23 Nov 2018 00:45:27 +0100
parents 7f0347d4c75e
children e37ef9a81737
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)  {
	// Prévention d'un "cassage" par ajout d'un commentaire incorrectement formaté
	$ip = $_SERVER['REMOTE_ADDR'];
	$Auteur = str_replace(array('<', '>'), array('&lt;', '&gt;'), $Auteur);

        /* Akismet */
	require_once('akismet.class.php');
	$comment = array(
		'author'    => $Auteur,
		'email'     => $AdresseMail,
		'website'   => $Adresse,
		'body'      => $Comment,
		'permalink' => BLOG_URL . '/posts/' . $id
	);
	$ak = new akismet(BLOG_URL, AKISMET_API_KEY, $comment);
	if(!$ak->errorsExist())
	  $visibleBool = !$ak->isSpam();
	else
	  $visibleBool = 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->Query("
		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(" & ", " &amp; ", $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;
?>