[plugin] MyProtectEmails

StéphaneStéphane Member, Former PluXml Project Manager
plxMyProtectEmails permet de protéger l'affichage des adresses emails dans les articles et les pages statiques de PluXml en utilisant un système d'encodage javascript.

Description

Téléchargement

HISTORIQUE
## Version 1.1 (09/07/2015) ##
[+] Protection des emails dans la méthode plxShow:staticInclude()

## Version 1.0 (16/12/2014) ##
version initiale

Consultant PluXml

Ancien responsable du projet (2010 à 2018)

Réponses

  • Si je comprends bien, la protection des mails se fait maintenant avec ce plugin, elle n'est plus intégrée à CKEditor.

    L'avantage est sans doute la simplification de la mise en place et des mises à jour ultérieures du plugin CKEditor, ce qui effectivement n'était pas un luxe :)
    mais aussi (et surtout) c'est que ce codage peut s'appliquer maintenant quel que soit l'éditeur choisi, et même si on n'utilise pas d'éditeur !
  • StéphaneStéphane Member, Former PluXml Project Manager
    @Francis: Exactement, c'est tout a fait ça

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • La protection d'email est optionnel sur spxtynimce donc on est bien.
  • Jerry WhamJerry Wham Member
    avril 2015 modifié
    Plutôt que d'utiliser la regex pour gérer les liens, je vous propose d'utiliser DOMDocument qui est plus fiable :
    /**
    	 * Méthode qui protège les adresses emails contre le spam
    	 *
    	 * @param	txt		chaine de caractères à protéger
    	 * @return	txt 	chaine de caractères avec les adresses emails protégées
    	 * @author	Cyril MAGUIRE
    	 **/
    	public static function protectEmails($txt) {
    		if(preg_match('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]/i', $txt)) {
    			$DOM = new \DOMDocument();
    			$DOM->loadHTML($txt);
    
    			$list = $DOM->getElementsByTagName('a');
    
    			foreach($list as $link){
    			    $href = $link->getAttribute('href');
    			    $text = $link->nodeValue;
    			    //only match if href starts with mailto:
    			    if(stripos($href, 'mailto:') === 0){
    			    	$a = '<a';
    			    	foreach ($link->attributes as $att) {
    			    		$a .= ' '.$att->name.'="'.$att->value.'"';
    			    	}
    			    	$a .= '>'.$text.'</a>';
    			    	$string = plxMyProtectEmails::encodeBin2Hex('document.write(\''.$a.'\')');
    					$txt = str_replace($a, '<script type="text/javascript">eval(unescape(\''.$string.'\'))</script>' , $txt);
    			    }
    			}
                            
    		        $s = preg_replace('/<input(\s+[^>]*)?>/i', '', $txt);
    		        $s = preg_replace('/<textarea(\s+[^>]*)?>.*?<\/textarea(\s+[^>]*)?>/i', '', $s);
    		        $s = preg_replace('/<(code|pre)(\b.*)<\/(code|pre)>/is', '', $s);
    		        if(preg_match_all('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $s, $matches)) {
    			     foreach($matches[0] as $k => $v) {
    				$string = plxMyProtectEmails::encodeBin2Hex('document.write(\''.$matches[0][$k].'\')');
    				$txt = str_replace($matches[0][$k], '<script>eval(unescape(\''.$string.'\'))</script>' , $txt);
    			    }
    		        }
    		}
    
    		return $txt;
    	}
    
  • FrancisFrancis Member
    juillet 2015 modifié
    La protection des mails marche très bien pour les articles et les pages statiques, mais pas quand on affiche une page statique avec un staticInclude.
    J'utilise une page statique pour le contenu d'une colonne latérale commune à tous les articles.

    J'ai trouvé la solution en remplaçant, dans article.php et dans home.php :
    [== PHP ==]
    <aside>
      <?php   $plxShow->staticInclude(1);  ?>
    </aside>
    
    par :
    
    [== PHP ==]
    <aside>
      <?php
          ob_start();
          $plxShow->staticInclude(1);
          $txt = ob_get_clean();
          if ( ! empty($plxShow->plxMotor->plxPlugins->aPlugins['plxMyProtectEmails']) )
                 { $txt = $plxShow->plxMotor->plxPlugins->aPlugins['plxMyProtectEmails']->protectEmails($txt); }
          echo $txt;
      ?>
    </aside>
    
    Est-ce que dans core/lib/class.plx.show.php, ce serait envisageable d'inclure un hook dans la fonction staticInclude($id), comme dans la fonction staticContent() ?
    Ça permettrait de traiter ce cas de figure à l'intérieur du plugin MyProtectEmails et d'utiliser ce hook dans d'autre plugins à l'avenir, toujours pour le cas d'une page statique qui sert à gérer le contenu d'une colonne latérale ou d'un encart dans une page.
  • Pour préciser mon idée, ça consisterait à remplacer, dans la fonction staticInclude de core/lib/class.plx.show.php :
    [== PHP ==]
    if($files = $plxGlob_stats->query('/^'.str_pad($id,3,'0',STR_PAD_LEFT).'.[a-z0-9-]+.php$/')) {
    	include(PLX_ROOT.$this->plxMotor->aConf['racine_statiques'].$files[0]);
    }
    
    
    par quelque chose de ce genre :
    [== PHP ==]
    if($files = $plxGlob_stats->query('/^'.str_pad($id,3,'0',STR_PAD_LEFT).'.[a-z0-9-]+.php$/')) {
    	ob_start();
    	include(PLX_ROOT.$this->plxMotor->aConf['racine_statiques'].$files[0]);
    	$output = ob_get_clean();
    	eval($this->plxMotor->plxPlugins->callHook('plxShowStaticInclude'));
    	echo $output;
    }
    
    
  • StéphaneStéphane Member, Former PluXml Project Manager
    ## Version 1.1 (09/07/2015) ##
    [+] Protection des emails dans la méthode plxShow:staticInclude()

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • StéphaneStéphane Member, Former PluXml Project Manager
    Francis a écrit:
    Est-ce que dans core/lib/class.plx.show.php, ce serait envisageable d'inclure un hook dans la fonction staticInclude($id), comme dans la fonction staticContent() ?

    la fonction staticInclude possède déjà un hook: plxShowStaticInclude

    @Francis: merci d'avoir remonté le problème. c'est pris en compte avec la v1.1 du plugin.
    J'ai repris en gros le code que tu proposes mais en l'adaptant en utilisant notamment le hook plxShowStaticInclude

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Merci Stéphane, je n'avais même pas fait attention que dans la fonction staticInclude, le hook que je proposais existait sur la ligne juste au-dessus ! :8

    En tout cas, je viens de mettre en place la nouvelle version, ça marche super bien ! :)
  • MyProtectEmails n'est pas proposé dans la liste des plugins officiels (où il devrait se trouver), ni dans celle des plugins non officiels, où j'ai jeté un œil au cas où.

    Je l'ai retrouvé sur http://www.pluxopolis.net/myplugins et il n'y a pas de nouvelle version par rapport à celle que j'avais, mais pour celui qui découvre PluXml, ce serait intéressant de faire connaître ce plugin très utile.
  • jol5926jol5926 Member

    Bonjour,
    Ce plugin est-il toujours d'actualité et est-il nécessaire de l'utiliser dans pluxml ?
    Merci

  • 17 janv. modifié

    Oui si tu met en clair des adresses mail.
    Pour que cela couvre le site entierement (pas seulement article et static) , tu peut modifier l'appel des hooks dans le plugin de cette façon:

    rechercher ces trois lignes:

                $this->addHook('plxMotorParseArticle', 'protectEmailsArticles');
                $this->addHook('plxShowStaticContent', 'protectEmailsStatics');
                $this->addHook('plxShowStaticInclude', 'plxShowEmailsStaticInclude');
    

    et les remplacer par cette seule ligne:

                $this->addHook('IndexEnd', 'protectEmailsStatics');
    

    Si tu met ton adresse mail dans le pied page à partir du thème, elle sera alors elle aussi encodé en javascript. L'encodage se fera automatiquement quelque soit la page affichée/demandée

    cdt


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

Connectez-vous ou Inscrivez-vous pour répondre.