Affichage d'une adresse mail, solution anti-spam tout en php

ViPHP
AB
ViPHP | 5818 Messages

19 janv. 2007, 04:00

Décidément Hubert, ton idée donne des idées :idea:

Voici donc ma version :
<?php
session_start();

$mail = urlencode(str_rot13('[email protected]'));

$num = isset($_SESSION['num'])? $_SESSION['num'] : 1;

$_SESSION['num'] = isset($_SESSION['num'])? $_SESSION['num'] : $num;

$adresse = isset($_GET['add'])? $_GET['add'] : '';

$envoi = isset($_GET['envoi'])? $_GET['envoi'] : '';

if ($envoi == $num)
{
$_SESSION['num']++;
header('Refresh: 0;url="mailto:' . urldecode(str_rot13($adresse)) . '"'); 
}
?>

Code : Tout sélectionner

<a href="<?php echo $_SERVER['PHP_SELF'].'?envoi='.$_SESSION['num'].'&add='.$mail ?>">mail</a>
Je suis passé par les sessions pour garder le lien affiché et ne pas déclencher l'envoi à chaque rafraichissement de la page.

Y'a plus qu'à placer son adresse mail à la place de '[email protected]' et ça roule.

C'est HyWaN qui va être content! Moi aussi :D

EDIT : Et puis je viens de penser au cas où ... pour les embêter un peu plus... on peut mettre le Refresh à par exemple 3... comme ils n'aiment pas attendre les robots...

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

19 janv. 2007, 05:09

Attention, le second urlencode() de mon exemple n'est pas une faute de frappe, il s'agit d'une mesure de sécurité pour éviter que quelqu'un injecte ce qui lui chante dans l'en-tête. À noter que PHP s'occupe lui-même de décoder ce que l'on passe dans une variables de requête, donc on n'utilise jamais urldecode() sur ces données.

Pour le reste, je ne suis pas certain de savoir à quoi sert $_SESSION['num'] dans ton exemple, AB, mais il risque de provoquer des erreurs dans certains cas, notamment si l'utilisateur clique sur 2 liens sur la même page ou dans des onglets différents. Mon conseil : n'utilisez jamais de variables de sessions. (à part pour des données temporaire sans importance qui n'influent pas sur la logique de l'application)

ViPHP
AB
ViPHP | 5818 Messages

19 janv. 2007, 06:27

Oui, je reviens car je me disais bien que y'avait pas tout bon. Donc + simple :
<?php
session_start();

$mail = '[email protected]';

$num = isset($_SESSION['num'])? $_SESSION['num'] : 1;
$_SESSION['num'] = isset($_SESSION['num'])? $_SESSION['num'] : $num;

$envoi = isset($_GET['envoi'])? $_GET['envoi'] : '';

if ($envoi == $num)
{
$_SESSION['num']++;
header('Refresh: 0;url="mailto:'.$mail.'"'); 
}
?>
et

Code : Tout sélectionner

<a href="<?php echo $_SERVER['PHP_SELF'].'?envoi='.$_SESSION['num'] ?>">mail</a>
Ma variable de session, ben c'est tout bête, c'est pour que si le visiteur clique sur le lien puis ensuite rafraichit la page, ça ne relance pas une nouvelle fois le logiciel de messagerie. Si on accepte cet inconvénient on peut bien sûr s'en passer.
Ou alors on prend ta solution initiale, mais le lien qui disparait...

Effectivement la variable de session fonctionne mal si on ouvre deux onglets de la même page. Mais dans ce code, le logiciel de messagerie s'ouvre dans tous les cas quand on clique une première fois sur le lien. C'est quand on clique une deuxième fois depuis un autre onglet que cela ne fonctionne pas.

A savoir donc quel est le moindre inconvénient. Je ne sais pas. Peut-être est-ce mieux de laisser le pb du rafraichissement.
On pourrait peut-être aussi passer par un cookie pour un meilleur compromis.

ViPHP
ViPHP | 4674 Messages

19 janv. 2007, 12:05

et si le visiteur n'accepte pas les cookies ? :lol:
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
AB
ViPHP | 5818 Messages

19 janv. 2007, 14:29

Bonjour HyWaN,

Par compromis, je voulais dire : si le navigateur accepte les cookies on fait le système ci-dessus qui évite l'ouverture du logiciel de messagerie lors d'un rafraichissement de la page après l'envoi d'un premier mail.
Sinon on garde ce pb mais l'envoie du mail fonctionne quand même.

Evidemment ce peut-être plus ou moins génant suivant le contexte.

Sinon l'effacement du lien comme dans la méthode initiale possède aussi un inconvénient si on souhaite envoyer un second mail juste après le premier.
Ou alors on peux essayer un système de popup. A suivre.

ViPHP
ViPHP | 4674 Messages

19 janv. 2007, 16:33

ok, autant pour moi alors :)
désolé :P

décidement, le spam est ..... (<- à vous de remplir ^^)
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
AB
ViPHP | 5818 Messages

20 janv. 2007, 05:36

Concernant mon dernier script posté,
C'est quand on clique une deuxième fois depuis un autre onglet que cela ne fonctionne pas.
Précision : C'est quand on clique une deuxième fois depuis un autre onglet précédemment ouvert sur la même page que cela ne fonctionne pas.

Donc le bug a très peu de chance de se produire.

Et finalement c'est un "demi" bug, car en cliquant sur le lien, cela rafraichi la page et réactualise la variable de session qui est passée dans le lien.
Ce qui fait qu'au deuxième click sur le même lien le logiciel de messagerie sera lancé. Et en général quand on clique sur un lien et que cela ne fonctionne pas, on fait toujours une deuxième tentative, non? Donc je me dis que c'est un bug vraiment mineur.

Finalement c'est très peu d'inconvénient pour une adresse qui est totalement invisible niveau html.

Qu'en pensez-vous?

Note : Après réflexion, la piste du cookie pour remplacer la variable de session est difficilement envisageable.

ViPHP
ViPHP | 4674 Messages

31 janv. 2007, 20:45

heya

je remonte un peu le thread mais bon ...
Je suis en train de coder un package Mail, et j'arrive sur le subpackage anti-spam forcément. Je retourne donc sur PHPFrance et retrouve ce thread.

Mais une chose m'échappe : le robot de spam va lire quoi ? Dans <a href="mailto:address1">address2</a>, le robot va lire address 1 ou 2 ?
Car ça change vraiment la logique.

Je suis sûrement à côté de mes pompes ce soir, mais je veux en être sûr ^^

Merci
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 3607 Messages

31 janv. 2007, 21:16

il va surement lire les deux :wink:
Je suis en train de dévelloper une solution antispam, içi
Pour l'instant, le seul problème réel, c'est que je n'arrive pas à rediriger vers une autre page, une fois le header de mailto envoyé...
Mais lorsque ce sera réglé, tu pourras intégégré (tel quel ou modifiée) ma solution si tu le souhaite!

ViPHP
ViPHP | 4674 Messages

31 janv. 2007, 21:40

J'ai déjà regardé ta class.
Elle est pas trop mal, mais un truc me dérange, mais c'est qu'on doit forcément passer l'encodage choisit.
Et ça me plaît moyen :P

J'attend une version plus évoluée de ta class pour comprendre son fonctionnement :)
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
AB
ViPHP | 5818 Messages

02 févr. 2007, 06:02

Bonjour,

Je comprends pas ta question HyWaN.
Je te remet tout le script d'un bloc pour qu'il te suffise de le recopier dans une de tes pages pour pouvoir le tester
<?php
session_start(); 

$mail = '[email protected]'; 

$num = isset($_SESSION['num'])? $_SESSION['num'] : 1; 
$_SESSION['num'] = isset($_SESSION['num'])? $_SESSION['num'] : $num; 

$envoi = isset($_GET['envoi'])? $_GET['envoi'] : ''; 

if ($envoi == $num) 
{ 
$_SESSION['num']++; 
header('Refresh:1;url="mailto:'.$mail.'"');   
} 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>
</head>

<body>
<a href="<?php echo $_SERVER['PHP_SELF'].'?envoi='.$_SESSION['num'] ?>">mail</a>
</body>
</html>
Donc le code source html interprété ressemblera à

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Document sans titre</title> </head> <body> <a href="/ton_site/ta_page.php?envoi=1">mail</a> </body> </html>
Y'a pas de mailto dans la partie html pas plus que d'adresse email puisqu'elle se trouve uniquement dans la partie php. Un robot qui ne lit que le html ne verra strictement rien. Et c'est pour cette raison qu'il n'y a pas d'encodage car il n'y a rien à encoder.
J'espère avoir répondu à ta question ;)

ViPHP
ViPHP | 4674 Messages

02 févr. 2007, 12:40

Heya :)

La discussion avait continué dans un autre topic (uè c'est pas très clair je sais).

Un problème persiste toujours pour moi, c'est le texte du lien.
Mais je vais poser ce problème dans l'autre topic :)

Merci
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
AB
ViPHP | 5818 Messages

02 févr. 2007, 17:38

Bonjour,

Dans l'exemple ci-dessus, le texte du lien est "mail" mais tu peux bien le remplacer par n'importe quoi et ça fonctionnera sans pb.

ViPHP
ViPHP | 4674 Messages

05 févr. 2007, 00:52

Bien sûr, mais je cherche à afficher l'addresse email dans le texte du lien, sans que le robot la catch.

Je sais c'est peut être stupide, mais j'ai encore jamais vu un lien vers un adresse email sans adresse email (un brin stupide aussi remarquez).

Alors je continue à chercher
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
AB
ViPHP | 5818 Messages

05 févr. 2007, 04:06

Salut HyWaN

Effectivement, le lien ici ne sert qu'à déclencher le logiciel de messagerie qui enverra un mail à la bonne adresse.
C'est équivalent à un mailto avec comme libellé "contact mail" excepté que l'adresse est invisible au niveau html. Cela dit, il est peut-être facile ensuite de récupérer l'adresse depuis le logiciel de messagerie.

Au départ la préoccupation d'Orbi était de pouvoir lancer un logiciel de messagerie...d'où ce script.