protection email

danielsandanielsan Member
octobre 2012 modifié dans Discussions générales
Bonjour,


est-ce que le code de protection d'email déjà présent dans ckeditor existe en natif dans PluXml ?
Si oui, où ?
Si non, serait-il utile de le mettre dans plxUtils ?

rappel du code:
	/**
	 * Méthode qui protège les adresses emails contre le spam
	 *
	 * @parm	txt		chaine de caractères à protéger
	 * @return	string	chaine de caractères avec les adresses emails protégées
	 * @author	Stephane F
	 **/
	public static function protectEmails($txt) {

		if(preg_match_all('/<a.+href=[\'"]mailto:([\._a-zA-Z0-9-@]+)((\?.*)?)[\'"]>([\._a-zA-Z0-9-@]+)<\/a>/i', $txt, $matches)) {
			foreach($matches[0] as $k => $v) {
				$string = ckeditor::encodeBin2Hex('document.write(\''.$matches[0][$k].'\')');
				$txt = str_replace($matches[0][$k], '<script type="text/javascript">eval(unescape(\''.$string.'\'))</script>' , $txt);
			}
		}
		if(preg_match_all('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $txt, $matches)) {
			foreach($matches[0] as $k => $v) {
				$string = ckeditor::encodeBin2Hex('document.write(\''.$matches[0][$k].'\')');
				$txt = str_replace($matches[0][$k], '<script type="text/javascript">eval(unescape(\''.$string.'\'))</script>' , $txt);
			}
		}
		return $txt;

	}

cela permet de l'appliquer à des champs spécifiques sans avoir le plugin ckeditor d'installé ...


Sinon j'utilisais cette astuce rigolote
<span style="unicode-bidi:bidi-override; direction: rtl;">
<?php echo strrev($email); ?>
</span>
le principe étant d'afficher l'email à l'envers
et lui appliquer un style CSS qui la remet dans le bon sens ... :p
j'aime bien le concept :cool:
mais ça bug quand l'email passe sur 2 lignes :(


Cordialement,

Réponses

  • Salut !!


    Protection email ? C'est à dire ? Ceux présents dans les com' ?
  • C'est bien sauf que tu utilises deux classes statiques de ckeditor !
  • @k610i: actuellement c'est pour le site avec des fiches de contact, cela protège (en théorie) les emails affichées.


    @Jerry: j'ai repris et directement intégré la fonction dans le template.


    Je trouve que c'est une fonction utile qui mériterait de faire partie de la bibli de pluxml plxUtils.
    Qu'en penses-tu ? Tu fais comment toi pour protéger les emails affichées ?
  • j'en profite d'ailleurs pour dire que si l'on crée un lien mailto avec un attribut "title", cela ne marche pas ( à cause du preg_match de la méthode )
  • Salut,
    Personnellement je me suis fait cette fonction:
    /*
    ** Protège le mail via un affichage js
    ** @author Frédéric K.
    ** @get protect_email('youremail@here.com');
    */
    	function protect_email($phpemail)
    	{
    		$pieces = explode("@", $phpemail);
    
    		return '
    			<script type="text/javascript">
    				var a = "<a href=\'mailto:";
    				var b = "' . $pieces[0] . '";
    				var c = "' . $pieces[1] .'";
    				var d = "\' class=\'email btn btn-mini btn-inverse\'><i class=\'icon-envelope icon-white\'></i> ";
    				var e = "</a>";
    				document.write(a+b+"@"+c+d+b+"@"+c+e);
    			</script>
    			<noscript>Activer JavaScript pour afficher le mail</noscript>
    		';
    	}
    
    Elle a pour but d'incruster l'email dans du javascript, js doit donc être activé.
  • Jerry WhamJerry Wham Member
    octobre 2012 modifié
    @Frédéric : pas mal comme fonction. Mais par contre, j'obtiens ceci comme code généré :
    <a href="mailto:adresse@domaine.com class=" email="" btn="" btn-mini="" btn-inverse"=""><i class="icon-envelope icon-white"></i> adresse@domaine.com</a>
    

    Je l'écrirais donc plutôt comme ça :
    /*
    ** Protège le mail via un affichage js
    ** @author Frédéric K.
    ** @get protect_email('youremail@here.com');
    */
    	function protect_email($phpemail)
    	{
    		$pieces = explode("@", $phpemail);
    
    		return "
    			<script type=\"text/javascript\">
    				var a = '<a href=\"mailto:';
    				var b = '$pieces[0]';
    				var c = '$pieces[1]';
    				var d = '\" class=\"email btn btn-mini btn-inverse\"><i class=\"icon-envelope icon-white\"></i> ';
    				var e = '</a>';
    				document.write(a+b+\"@\"+c+d+b+\"@\"+c+e);
    			</script>
    			<noscript>Activer JavaScript pour afficher le mail</noscript>
    		";
    	}
    

    C'est juste une histoire de guillemets...


    Une autre remarque : ckeditor crypte les adresses à la volée en scannant l'ensemble du texte, tandis que ta fonction nécessite d'entrer l'email.
    Il faudrait combiner les deux pour avoir une fonction qui déchire...

    [del]Qui s'y colle ? :p[/del]

    Voici ma proposition avec vos deux fonctions combinées :
    /*
    ** Protège le mail via un affichage js
    ** @author Frédéric K.
    ** @get protect_email('youremail@here.com');
    */
    	function protect_email($phpemail)
    	{
    		$pieces = explode("@", $phpemail);
    
    		return "
    			<script type=\"text/javascript\">
    				var a = '<a href=\"mailto:';
    				var b = '$pieces[0]';
    				var c = '$pieces[1]';
    				var d = '\" class=\"email btn btn-mini btn-inverse\"><i class=\"icon-envelope icon-white\"></i> ';
    				var e = '</a>';
    				document.write(a+b+\"@\"+c+d+b+\"@\"+c+e);
    			</script>
    			<noscript>Activer JavaScript pour afficher le mail</noscript>
    		";
    	}
    
    	/**
    	 * Méthode qui protège les adresses emails contre le spam
    	 *
    	 * @parm	txt		chaine de caractères à protéger
    	 * @return	string	chaine de caractères avec les adresses emails protégées
    	 * @author	Stephane F
    	 **/
    	function protectEmails($txt) {
    
    		if(preg_match_all('/<a.+href=[\'"]mailto:([\._a-zA-Z0-9-@]+)((\?.*)?)[\'"]>([\._a-zA-Z0-9-@]+)<\/a>/i', $txt, $matches)) {
    			foreach($matches[0] as $k => $v) {
    				$string = protect_email($matches[0][$k]);
    				$txt = str_replace($matches[0][$k], $string , $txt);
    			}
    		}
    		if(preg_match_all('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $txt, $matches)) {
    			foreach($matches[0] as $k => $v) {
    				$string = protect_email($matches[0][$k]);
    				$txt = str_replace($matches[0][$k], $string , $txt);
    			}
    		}
    		return $txt;
    
    	}
    
  • Jerry WhamJerry Wham Member
    octobre 2012 modifié
    [del]C'est à moitié bien car le code généré n'est pas valide du point de vue html (un script dans un p).[/del] Faites comme si je n'avais rien dit :/
  • danielsandanielsan Member
    octobre 2012 modifié
    il manque l'encodage hexa:
    	/**
    	 * Méthode qui encode une chaine de caractère en hexadecimal
    	 * ( importée de ckeditor )
    	 *
    	 * @parm	s		chaine de caractères à encoder
    	 * @return	string	chane de caractères encodée en hexadecimal
    	 * @author	Stephane F
    	 **/
    	function encodeBin2Hex($s) {
    		$encode = '';
    		for ($i = 0; $i < strlen($s); $i++) {
    			$encode .= '%' . bin2hex($s[$i]);
    		}
    		return $encode;
    	}
    
    
    	/**
    	 * Méthode qui protège les adresses emails contre le spam
    	 * ( importée de ckeditor )
    	 *
    	 * @parm	txt		chaine de caractères à protéger
    	 * @return	string	chaine de caractères avec les adresses emails protégées
    	 * @author	Stephane F
    	 **/
    	function protectEmails($txt) {
    		if(preg_match_all('/<a.+href=[\'"]mailto:([\._a-zA-Z0-9-@]+)((\?.*)?)[\'"]>([\._a-zA-Z0-9-@]+)<\/a>/i', $txt, $matches)) {
    			foreach($matches[0] as $k => $v) {
    				$string = encodeBin2Hex('document.write(\''.$matches[0][$k].'\')');
    				$txt = str_replace($matches[0][$k], '<script type="text/javascript">eval(unescape(\''.$string.'\'))</script>' , $txt);
    				$txt .= "<noscript></noscript>";
    			}
    		}else{}
    		if(preg_match_all('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $txt, $matches)) {
    			foreach($matches[0] as $k => $v) {
    				$string = encodeBin2Hex('document.write(\''.$matches[0][$k].'\')');
    				$txt = str_replace($matches[0][$k], '<script type="text/javascript">eval(unescape(\''.$string.'\'))</script>' , $txt);
    				$txt .= "<noscript></noscript>";
    			}
    		}else{}
    		return $txt;
    	}
    

    et pour afficher l'email:
    <?php
    // affichage de l'email avec le lien
    echo protectEmails("<a href=\"mailto:".$email."\">".$email."</a>");
    
    // affichage de l'email sans le lien
    echo protectEmails($email);
    ?>
    
  • StéphaneStéphane Member, Former PluXml Project Manager
    c'est quoi ces else{} qui traînent dans le code la fonction protectEmails()

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • lol, ils n'y sont pas d'origine.
    J'ai un (mauvais?) réflexe de mettre un else après un if.
    Sauf que là c'est un elseif
  • StéphaneStéphane Member, Former PluXml Project Manager
    lol :)
    pas sur que ce soit un elseif, mais bien 2 if distincts

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • Jerry WhamJerry Wham Member
    octobre 2012 modifié
    En parlant de cette fonction, la regex
    if(preg_match_all('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $txt, $matches)) {
       foreach($matches[0] as $k => $v) {
          $string = ckeditor::encodeBin2Hex('document.write(\''.$matches[0][$k].'\')');
          $txt = str_replace($matches[0][$k], '<script type="text/javascript">eval(unescape(\''.$string.'\'))</script>' , $txt);
       }
    }
    
    ne prend pas en compte le fait que l'adresse puisse être dans un formulaire. Ce qui peut être génant.

    Par exemple, avec le plugin plxMyContact, si on échoue à l'enregistrement du formulaire parce que l'utilisateur a oublié un champ, l'email est obfusqué ce qui met toute la mise en page en l'air.


    Ne peut-on pas modifier la regex pour qu'elle prenne en compte cette éventualité ?


    Je m'auto-réponds: En attendant une meilleure, je vous propose ceci.


    A la place de :
    if(preg_match_all('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $txt, $matches)) {
       foreach($matches[0] as $k => $v) {
            $string = ckeditor::encodeBin2Hex('document.write(\''.$matches[0][$k].'\')');
            $txt = str_replace($matches[0][$k], '<script type="text/javascript">eval(unescape(\''.$string.'\'))</script>' , $txt);
       }
    }
    
    mettre
    if(!preg_match_all('/value="[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+"/i', $txt, $matches)) {
       if(preg_match_all('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $txt, $matches)) {
           foreach($matches[0] as $k => $v) {
                $string = ckeditor::encodeBin2Hex('document.write(\''.$matches[0][$k].'\')');
    	    $txt = str_replace($matches[0][$k], '<script type="text/javascript">eval(unescape(\''.$string.'\'))</script>' , $txt);
           }
       }
    }
    
Connectez-vous ou Inscrivez-vous pour répondre.