Csókavár

Spam filter házilag

A Freeblogon rendszeresen végigjárja valami hülye robot a bejegyzéseimet, és telepakolja 'Hi guys, check out these cool sites' kezdetű szeméttel az én drága írásaimat. Szerencsére, a gyári spamszűrő rendszerint kidobálja őket a fenébe.

Elkezdtem gondolkozni, hogyan lehetne ilyet csinálni a saját honlapomra (mármint a https://csokavar.hu-ra/). Végül három, egymást kiegészítő megoldásra jutottam.

A tartalom vizsgálata

A nyilvánvaló megoldás a tiltott szavak (viagra, penis, stb.) szűrése. Csábító lenne valami Bayes-szűrőt implementálni, de kiderült, ebben az esetben teljesen felesleges. A kapott szemetet analizálva arra jutottam, hogy a hozzászólásokkal ellentétben, a spamek tele vannak linkekkel. Így a viagrás szabály mellé betettem a linkek számára is egy korlátot. Nem dobunk ki semmit, de ha valaki túl sok linket akar a hozzászólásába tenni, akkor az először moderálásra kerül.

IP alapú szűrés

Viszonylag hamar ráleltem a www.spamhaus.org-ra, ami egy nonprofit feketelista szolgáltató. Sajnos csak ahhoz adnak segítséget, hogy az ember a mail szerverét illessze hozzájuk. Mivel én egy üzenőfalat akarok vele filterezni, kénytelen voltam kicsit tovább keresgélni.

Kiderült, hogy a srácok igazán leleményes megoldást találtak a lista lekérdezésére: ráapplikálták a DNS-re. A szolgáltatással azt tudjuk kideríteni, hogy egy IP címen notorius spamelők laknak-e, vagy sem.

Adott tehát egy IP cím. A példa kedvéért mondjuk 127.0.0.2.. Ez megállapodás szerint feketelistás cím. Mivel a való világban nem fordul elő, nem okoz problémát. (Már amennyire biztos lehetek ilyenekben, nem vagyok informatikus.) Ebből a tagok megfordításával és a .sbl-xbl.spamhaus.org szuffixel csinálunk egy domain nevet, és ezt egy sima nslookup-al megpróbáljuk feloldani.

Konkrétan:

>nslookup 2.0.0.127.sbl-xbl.spamhaus.org
Server: xxx.xxx.xxx.xxx
Address: xxx.xxx.xxx.xxx#yyy

Non-authoritative answer:
Name: 2.0.0.127.sbl-xbl.spamhaus.org
Address: 127.0.0.2
Name: 2.0.0.127.sbl-xbl.spamhaus.org
Address: 127.0.0.4

A két válasz azt jelenti, hogy 'fúj spam', ha nem kapnánk választ: 'nem spam'. Precízebben:

127.0.0.2: Direct UBE sources, verified spam services and ROKSO spammers
127.0.0.4-6: Illegal 3rd party exploits, including proxies, worms and trojan exploits

Nekem ez nagyon bejön... Aztán találtam még egy php kódot is (fúj konzerv) hozzá:

function is_blacklisted($ip)
{
  // written by satmd, do what you want with it, but keep the author please
  $result=Array();
  $dnsbl_check=array("bl.spamcop.net",
                     "list.dsbl.org",
                     "sbl.spamhaus.org");
  if ($ip)
  {
    $quads=explode(".",$ip);
    $rip=$quads[3].".".$quads[2].".".$quads[1].".".$quads[0];
    for ($i=0; $i<count($dnsbl_check); $i++)
    {
      if (checkdnsrr($rip.".".$dnsbl_check[$i].".","A"))
      {
        $result[]=Array($dnsbl_check[$i],$rip.".".$dnsbl_check[$i]);
      }
    }
    return $result;
  }
}

Ennyi. :)

Javascript

Már a fenti két megoldás is kiszűrte a szemetet, de zavaró volt, hogy utólag kézzel kell őket kitörölnöm. Egy újabb kis trükkel azonban sikerült teljesen kiírtani a spamet az oldalról.

Az oskolában azt tanítják, hogy olyan oldalt csináljunk, amit a keresőrobotok könnyen el tudnak olvasni. Na mit nem tudnak a keresőrobotok? Javascriptet futtatni. Legalábbis ezt nehezebb megvalósítani, mint az xhtml oldalakból a form-ok kiszedegetését. Tudom, hogy egy valamirevaló oldalnak javascript nélkül is illik működni, de ez egyrészt eddig sem volt így, hála az Active-X vezérlőknek, másrészt manapság úgyis az AJAX felé megy a világ (és az oldalam is), amihez pedig elengedhetetlen valami kliens oldali script nyelv. Summa summarum: beáldoztam a formok javascript mentességét a spam filter oltárán. Pillanatnyilag a form action attribútuma, azaz annak az oldalnak a címe, ami a formot feldolgozza, javascriptből jön.

Működik. Tegyük hozzá: egyelőre. Attól nem kell félek, hogy az én kis látogatottságú oldalamra valaki kézzel megírja a küldő scriptet. Sokkal aggasztóbb, hogy előbb-utóbb feltalálják a javascriptet is futtatni képes spam robotot. Onnan már csak a regisztráció vagy captchak tudnának kirángatni, de azokat már nem fogok bevezetni, azt hiszem...