Suite à ce problème, et à l'idée de Hubert
Je me suis mis en tête de faire une classe d'antispam php...
Elle est fonctionnelle en l'état, mais il reste tout de même de nombreuses améliorations à faire...
Je compte donc sur vos critiques pour faire évoluer le bazard...
Voici la classe:
<?php
/**
* Classe anti-spam
* Permet d'utiliser le traditionnel mailto
* Sans les désagréments des spammeurs...
*
* Attention, la fonction mailto() est à utilisée
* avant tout envoi de contenu/entêtes au navigateur
* Car elle en envoie elle-même
*
* Exemple d'utilisation :
* <code><?php
* if(empty($_SERVER['QUERY_STRING']))
* {
* $spam = new antiSpam('[email protected]', 'vigenere', 'un titre','un petit texte de contenu');
* $spam->writeLink();
* }
* else
* {
* $spam = new antiSpam($_SERVER['QUERY_STRING'],'vigenere');
* $spam->mailto();
* }
* ?></code>
*
* @author Joris Mulliez
* @package Mail
*/
class antiSpam
{
/**
* Borne infèrieure pour la génération de la clé aléatoire
*/
const BORNE_RAND_INF=1;
/**
* Borne supèrieure pour la génération de la clé aléatoire
*/
const BORNE_RAND_SUP=255;
/**
*
*/
const RANDOM=0;
/**
*
*/
const DEFAULT_URL='php_self';
/**
* Texte affiché par defaut entre <a...> et </a> s'il n'est pas précisé
*/
const DEFAULT_TXT='click';
/**
* Title par defaut du lien
*/
const DEFAULT_TITLE='E-mail';
/**
* Variable contenant l'email à cacher des spammeurs
*/
private $email=null;
/**
* Variable contenant la clé de cryptage
*/
private $crypt_methode=null;
/**
* Variable contenant un éventuel sujet du mail
*/
private $subject=null;
/**
* Variable contenant un éventuel contenu du mail
*/
private $body=null;
/**
* Variable contenant l'url vers laquelle renvoi le lien
*/
private $url=null;
/**
* Variable contenant le texte entre les balises <a...> et </a>
*/
private $txt=null;
/**
* Variable contenant un éventuel title du lien
*/
private $title=null;
/**
* tableau des correspondances fonctions méthodes de cryptage
*/
private $crypt_functions=array('vigenere'=>array('vig_crypt','vig_decrypt'),'cesar'=>array('cesar_crypt','cesar_decrypt'));
/**
* Constructeur
*
* @param String $email
* @param Int $key
* @param String $subject
* @param String $body
* @param String $url
* @param String $txt
* @param String $title
*/
public function __construct($email,$crypt_methode=RANDOM,$subject=null,$body=null,$url='php_self',$txt=null,$title=null)
{
$this->email = $email;
$this->crypt_methode = $crypt_methode;
$this->subject = $subject;
$this->body = $body;
$this->url = $url==self::DEFAULT_URL ? $_SERVER['PHP_SELF'] : $url;
$this->txt = $txt==null ? self::DEFAULT_TXT : $txt;
$this->title = $title==null ? self::DEFAULT_TITLE : $title;
}
/**
* Fonction writeLink
* permet d'écrire le lien à cliquer pour effectuer le mailto
*/
public function writeLink()
{
$tmp[] = (!empty($this->subject)) ? 'subject='.$this->subject : false;
$tmp[] = (!empty($this->body)) ? 'body='.$this->body : false;
$tmp=implode('&',$tmp);
$mailto = $this->email.(!empty($tmp) ? '?'.$tmp : '');
$mailto = $this->encoder($mailto);
echo '<a title="'.$this->title.'" href="'.$this->url.'?' . urlencode($mailto) . '">'.(!empty($this->txt) ? $this->txt : 'click').'</a>';
}
/**
* Fonction mailto
* permet de décoder l'email et ses paramètres et de l'enovoyer en entête afin de lancer le logiciel de messagerie
*/
public function mailto()
{
header('Refresh: 0;url="mailto:'.$this->decoder(urldecode($this->email)));
exit();
}
/**
* Fonction encoder
* @param String $str la chaine à encoder
* @return String la chaine encodée
*/
private function encoder($str)
{
return $this->{$this->crypt_functions[$this->crypt_methode][0]}($str);
}
/**
* Fonction decoder
* @param String $str la chaine à decoder
* @return la chaine decodée
*/
private function decoder($str)
{
return $this->{$this->crypt_functions[$this->crypt_methode][1]}($str);
}
/**
* Fonction cesar_crypt
* @param String $str la chaine à encoder
* @return la chaine encodée
*/
private function cesar_crypt($str)
{
$key=rand(1,255);
$temp='';
for($i=0;$i<strlen($str);$i++){
$temp.=chr(ord($str{$i})+$key);
}
return chr($key).$temp;
}
/**
* Fonction cesar_decrypt
* @param String $str la chaine à decoder
* @return la chaine decodée
*/
private function cesar_decrypt($str)
{
$key=ord($str[0]);
$temp='';
for($i=1;$i<strlen($str);$i++){
$temp.=chr(ord($str{$i})-$key);
}
return $temp;
}
/**
* Fonction vig_crypt
* @param String $str la chaine à encoder
* @return la chaine encodée
*/
private function vig_crypt($texteaCrypter,$longueurcle=0)
{
for($i=0;$i<=255;$i++){
$carreVigenere[$i]=array();
$x=$i;
for($j=0;$j<=255;$j++){
$carreVigenere[$i][]=chr($x);
$x=(($x<255) ? $x+1 : 0);
}
}
$Cle='';
if($longueurcle==0) $longueurcle=rand(5,30);
for($i=0;$i<$longueurcle;$i++)
$Cle.=chr(rand(0,255));
$texteCrypter=='';
$j=0;
for($i=0;$i<strlen($texteaCrypter);$i++){
//on "descend" à la ligne correspondant à la lettre de la cle et ça nous donne la lettre cryptée
$texteCrypter.=$carreVigenere[ord($Cle{$j})][ord($texteaCrypter{$i})];
//gestion de la rotation de la clé
$j=(($j<($longueurcle-1)) ? $j+1 : 0);
}
return chr($longueurcle).$Cle.$texteCrypter;
}
/**
* Fonction vig_decrypt
* @param String $str la chaine à decoder
* @return la chaine decodée
*/
private function vig_decrypt($texteaDecrypter)
{
for($i=0;$i<=255;$i++){
$carreVigenere[$i]=array();
$x=$i;
for($j=0;$j<=255;$j++){
$carreVigenere[$i][]=chr($x);
$x=(($x<255) ? $x+1 : 0);
}
}
$longueurcle=ord($texteaDecrypter{0});
$Cle='';
for($i=1;$i<=$longueurcle;$i++)
$Cle.=$texteaDecrypter{$i};
$texteDecrypter='';
$j=0;
for($i=$longueurcle+1;$i<strlen($texteaDecrypter);$i++){
//on cherche la position de la lettre du texte crypté dans la ligne correspondant à la lettre de la clé
$key=array_keys($carreVigenere[ord($Cle{$j})],$texteaDecrypter{$i});
// on "remonte" à la première ligne et ça nous donne la lettre décryptée
$texteDecrypter.=$carreVigenere[0][$key[0]];
//rotation de la clé
$j=(($j<($longueurcle-1)) ? $j+1 : 0);
}
return $texteDecrypter;
}
}
?>et un exemple d'utilisation:<?php
if(empty($_SERVER['QUERY_STRING'])){
$spam = new antiSpam('[email protected]','cesar','un titre','un petit texte de contenu');
$spam->writeLink();
} else {
$spam = new antiSpam($_SERVER['QUERY_STRING'],'cesar');
$spam->mailto();
}
?>
voilà j'attend vos remarques