Veilige e-mailadressen op je website

Trefwoorden: anti-spam, htmlencode, safe email, e-mail encoder
Spam, het is een probleem waar elke webmaster/internetgebruiker vroeg of laat mee krijgt af te rekenen. Er bestaan tegenwoordig een hoop betrouwbare spamfilters, blacklists, et cetera, maar wat als we nu het probleem eens bij een van de bronnen konden aanpakken? Een van de manieren waarop spammers aan e-mailadressen geraken, is het zogenaamde harvesten van websites. Hier wordt mee bedoeld dat men een bot loslaat op een website. Deze bot indexeert alle e-mailadressen op de website en slaat deze vervolgens op. We kunnen dit (deels) voorkomen door de e-mailadressen te gaan coderen. Elk karakter intern voorgesteld als een binaire waarde. Elk karakter uit het Westerse alfabet komt ook voor in de ASCII-tabel. Door elk karakter te vervangen door zijn ASCII-waarde, kunnen we de bots te slim af zijn.

Om dit te kunnen bewerkstelligen heb ik een korte klasse geschreven. De code had hier ook kunnen staan zonder via een klasse te werken, maar door het feit dat de code werkt via een methode in een klasse, kan je zelf nog snel methodes toevoegen aan de klasse. Zij die dit niet nodig achten, kunnen de methode uit de klasse halen en ze als een losse functie gebruiken ;).

PHP
  1. <?php
  2. /**
  3. * Gebruik deze klasse om je e-mailadressen op je website te
  4. * encoderen zodat spambots ze niet kunnen harvesten.
  5. * De klasse telt slechts ťťn methode, maar is steeds eenvoudig
  6. * uit te breiden met je eigen (zelfgeschreven) methodes.
  7. *
  8. * @author Martijn Wouters
  9. * @version 1.0.0
  10. */
  11.  
  12. class Email {
  13.        
  14.         /**
  15.          * De enige functie in deze klasse. De methode telt 4 argumenten
  16.          * waarmee je de verschillende delen in de link kan typeren.
  17.          *
  18.          * @param string $email Het eigenlijke e-mailadres om te encoden
  19.          * @param string $tekst De tekst waarvan een link gemaakt dient te worden
  20.          * @param boolean $encodeTekst Geeft aan of de tekst ook gecodeerd moet worden (niet verplicht)
  21.          * @param string $onderwerp Het onderwerp van de mail (niet verplicht)
  22.          * @param string $bericht De tekst die standaard in de mail moet verschijnen (niet verplicht)
  23.          *
  24.          * @return string De gecodeerde waarde wordt teruggegeven
  25.         */
  26.         function encodeerEmail($email, $tekst, $encodeTekst = true, $onderwerp = "", $bericht = "")
  27.         {
  28.                
  29.                 // Het e-mailadres opsplitsen per karakter
  30.                 $karakters = preg_split("//", $email, -1, PREG_SPLIT_NO_EMPTY);
  31.                
  32.                 // Nieuw e-mailadres opbouwen
  33.                 $gecodeerdeEmail = '<a href="mailto:';
  34.                
  35.                 // Het zonet opgesplitste e-mailadres doorlopen
  36.                 foreach ($karakters as $karakter)
  37.                 {
  38.                        
  39.                         // Van elk karakter vragen we nu de ASCII-code op
  40.                         $gecodeerdeEmail .= '&&#35;'.ord($karakter).';';
  41.                        
  42.                 }
  43.                
  44.                 // Als een van de niet-verplichte velden werd opgegeven, voegen we deze toe aan het
  45.                 // gecodeerde e-mailadres
  46.                 $gecodeerdeEmail .= (strlen($onderwerp) != 0 || strlen($bericht) != 0) ? '?' : '';
  47.                 $gecodeerdeEmail .= ($onderwerp != '') ? 'subject='.$onderwerp : '';
  48.                 $gecodeerdeEmail .= (strlen($onderwerp) != 0 && strlen($bericht) != 0) ? '&amp;' : '';
  49.                 $gecodeerdeEmail .= ($bericht != '') ? 'body='.$bericht : '';
  50.                
  51.                 // We hebben nu een gecodeerd e-mailadres, maar als de tekst die als link gebruikt werd eveneens
  52.                 // een e-mailadres is, doen we er goed aan deze ook te coderen.
  53.                 // De keuze om deze te coderen wordt gemaakt via het argument $encodeTekst .
  54.                 if ($encodeTekst)
  55.                 {
  56.                        
  57.                         // De tekst opsplitsen per karakter, net zoals bij het e-mailadres
  58.                         $karakters = preg_split("//", $tekst, -1, PREG_SPLIT_NO_EMPTY);
  59.                        
  60.                         // De waarde van $tekst zit nu in de array $karakters, dus kunnen we nu
  61.                         // de gecodeerde tekst in deze string steken.
  62.                         $tekst = '';
  63.                        
  64.                         // Ook hier doorlopen we de opgesplitste string
  65.                         foreach ($karakters as $karakter)
  66.                         {
  67.                                
  68.                                 // Van elk karakter vragen we nu de ASCII-code op
  69.                                 $tekst .= '&&#35;'.ord($karakter).';';
  70.                                
  71.                         }
  72.                        
  73.                 }
  74.                
  75.                 // Laatste stukje van het e-mailadres samenstellen
  76.                 $gecodeerdeEmail .= '">'.$tekst.'</a>';
  77.                
  78.                 // De waarde teruggeven
  79.                 return $gecodeerdeEmail;
  80.                
  81.         }
  82.        
  83. }
  84.  
  85. ?>


Tot zover het eigenlijke script. Hieronder kan je een manier vinden om dit script te gebruiken.

PHP
  1. <?php
  2.  
  3. // Nieuw object van de klasse Email aanmaken
  4. $mail = new Email;
  5.  
  6. // Het gecodeerde e-mailadres outputten
  7. echo $mail -> encodeerEmail("test@example.com","test@example.com", true,"Onderwerp van de e-mail", "Deze tekst komt in de berichtsectie van de e-mail te staan.");
  8. ?>
Dit artikel werd geschreven door Martijn op donderdag 10 maart 2005 om 21:40 en werd sindsdien 3357 keer gelezen.

  • Pagina
  • 1 van 1

Bericht geplaatst door bakske op donderdag 10 maart 2005 om 22:46:50.
bakske's avatar
Multiviteit: 224
Identify as Opera
is het weergeven als een afbeelding geen betere beveiliging? nadeel is dan wel dat het niet als een link kan weergegeven worden...
Bericht geplaatst door Martijn op vrijdag 11 maart 2005 om 11:17:42.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder

Dixit

bakske (op 10/03/2005 22:46:50) zei:
is het weergeven als een afbeelding geen betere beveiliging? nadeel is dan wel dat het niet als een link kan weergegeven worden...


Dat's een vervolg hierop/een keuze die je dient te maken.
Je kan de afbeelding combineren met een link, gemaakt door deze methode/functie of je kan werken met enkel deze methode.

Volledige zekerheid heb je inderdaad enkel met een image, maar er zijn veel mensen die thuis geen GD Libraries (bijvoorbeeld) geÔnstalleerd hebben. Dan kan deze klasse handig zijn omdat die werkt met een standaard PHP 5-installatie.

Daarbij komt nog dat veel vragen m.b.t. PHP gaan over afbeeldingen, dus ook daar kunnen dan weer problemen optreden. Dit script dient gewoon om snel een e-mailadres (relatief) veilig te kunnen encoderen.

Je bemerking is echter wel 100% correct :).
Met vriendelijke groeten,
Martijn Wouters
Bericht geplaatst door een gast op dinsdag 15 maart 2005 om 10:52:04.
Een image is geen 100% beveiliging, je kan tekst-herkenningssoftware gebruiken om te zien wat er staat. Dat is ook de reden waarom de veiligheids codes in sommige php apps zo vaag zijn. Verder vraag ik me af of ze het geŽncode e-mail adres niet gewoon zullen met opnemen en moest deze methode veel gebruikt zijn zal men je e-mail adressen gegarandeerd kunnen verzamelen. Spam is big business, vergeet dat niet.
Bericht geplaatst door Slicer op dinsdag 15 maart 2005 om 11:00:28.
Slicer's avatar
Multiviteit: 68
En verder nog: waarom gebruik je niet de snelste methode om per character te encoderen? regexp s zijn hier onnodig en maken de functie onnodig zwaar. Ook is het hier niet nodig omje klasse te initialiseren daar het een statische functie is (het zou wss zelfs beter een gewone functie zijn, maar als je volledig OO werkt kan ik er nog inkomen datje het zo zou gebruiken)
Bericht geplaatst door rObkE op donderdag 17 maart 2005 om 12:09:37.
rObkE heeft nog geen avatar toegevoegd
Multiviteit: 3765

Dixit

Gast (op 15/03/2005 10:52:04) zei:
Een image is geen 100% beveiliging, je kan tekst-herkenningssoftware gebruiken om te zien wat er staat. Dat is ook de reden waarom de veiligheids codes in sommige php apps zo vaag zijn. Verder vraag ik me af of ze het geŽncode e-mail adres niet gewoon zullen met opnemen en moest deze methode veel gebruikt zijn zal men je e-mail adressen gegarandeerd kunnen verzamelen. Spam is big business, vergeet dat niet.
Ik denk niet dat er veel spiders zijn die elke afbeelding gaan downloaden, foutloos OCR'en, en dan checken op e-mailadressen. (dream)
  • Pagina
  • 1 van 1