Hlavní navigace

Komentárový spam

18. 9. 2006
Doba čtení: 10 minut

Sdílet

Verím, že ste sa s tým stretli všetci a že mnohí márne bojujete voči spamu v diskusiách. Scenár je rovnaký. Najprv zistíte, že niekto hľadá na Google text približne tohoto znenia "inurl:/kniha.php". No a potom sa vo vašom guest booku objaví ironická správa. Čo s tým?

A teraz môžete čakať pohromu. V priebehu niekoľkých hodín máte v diskusii toľko spamu, že to vyzerá ako „spam veľkosklad“. Ak máte smolu, že to nesledujete (ste na dovolenke), tak sa nedobrovoľne stávate súčasťou farmy nejakého spamera. A tak ako ja hľadáte riešenia. V globále existujú 3 riešenia.

  1. Zastavíte možnosť pridávať správy. To musíte spraviť aspoň na chvíľu (24 hodín???).
  2. Rezignujete na to, zrušite guest book, fórum, web formulár na posielanie emailu. Skrátka zrušíte akúkoľvek interaktivitu s vášmi návštevníkmi.
  3. Vypracujete nejaký nástroj kontroly. Niečo, čo odfiltruje spam robotov, a nechá len príspevky normálnych návštevníkov.

Smutné a pre rozvoj internetu priamo cesta spať je riešenie 2, prípadne veľmi dlho trvajúce riešenie 1. Pre potreby ľudí, čo spravujú malé osobné stránky, som pozbieral tieto riešenia. Pokiaľ bolo možné, uvádzam mená autorov a zdroj.

Takže ideme nato:

1. Nech vyhľadávače ignorujú diskusnú knihu.

Prvé, čo odporúčam spraviť, je, aby guestbook nebol indexovaný vyhľadávačmi. Slúži k tomu súbor robots.txt. Pre bližšie info môžete ísť sem www.jakpsatweb­.cz/robots-txt.html. Je to síce krok navonok neviditeľný a ten, voči komu je namierený (náš spamer), o tom nevie, ale beriem to ako malú odplatu. Zníži sa tak rating spamu. Toto sa samozrejme nedá použiť, ak je server založený práve na diskusiách. Mnohým to môže pripadať ako kontroverzný krok.

2. Filtrovať príspevky

2.1 IP filter

Filtrovať príspevky a tie od notorických prispievateľov jednoducho zahadzovať. Je to nápad, ktorý mnohý dostanete ako prvý, ale má veľa nevýhod a samozrejme dnes je už neúčinný. Dôvody prečo?

  • Dnes už spameri menia veľmi rýchlo svoje IP, napríklad zombie PC
  • Alebo za jedným IP sedí viacero počítačov. Typicky učebňa v škole.

2.2 Textový filter

Asi netreba vysvetľovať. Môže byť účinný, pretože sa stretávame stále s tou istou reklamou na online casino, viagru,… Spraviť takýto filter je jednoduché a predpoklad, že niekto píše príspevok, v ktorom sa vyskytujú tieto slová, je nízky. Ale budete musieť neustále obnovovať databázu o nové slová a kombinácie slov. Naopak spamer bude hľadať kombinácie, ktorými náš filter oklame a určite ich nájde.

3. Zakázať text, ktorý by obsahoval www adresu.

Takže jednoduchý parser, ktorý ak nájde www adresu, príspevok odošle na schválanie adminovi, alebo rovno zahodí. Ale to veľmi nepomôže. Spamerom ide o to, aby sa vo vyhľadávačoch na prvé pozície dostávalo určité slovné spojenie, pričom stačí, že vo väčšine je správna adresa. Preto ak má na vašej stránke text bez odkazu na www, tak mu to dá určite bodíky, ktoré potrebuje.

4. Meníme názvy položiek pre POST.

Spameri si stránku oskenujú a zistia položky formulára. Napríklad subject= a message=. To sú veľmi obľúbené mená. Takže stačí spraviť script, ktorý tieto vyplní a urobí POST. Jednoduchou metódou preto je dynamicky meniť mená týchto položiek. Napríklad subject123, message362. Prípadne vymyslieť zložitejší kľúč. Za tento námet ďakujem Michalovi Ludvigovi.

5. Prehodíme zodpovednosť na emailové servery.

Áno, metóda spočíva v tom, že sa diskutér musí zaregistrovať a uviesť svoju e-mailovú adresu. Na túto adresu sa odošle potvrdzujúci link. Má to tie výhody, že ak nájdete spamera, tak mu zakážete konto a je to. Vytvorenie nového konta trochu trvá. A ak to skombinujete napríklad s tým, že nemôže posielať príspevky častejšie ako raz za minútu, dokážete ustriehnuť príspevky a zamedziť prípadnému masívnemu útoku. Nevýhoda je, že sa vyžaduje ručná kontrola príspevkov a sú nutné zásahy administrátora.

6. Robot je rýchly, človek nie

Z toho sa dá vychádzať a kontrolovať čas, ako dlho trvalo človeku napísať príspevok. Ak predpokladáme, že málokto dokáže písať rýchlejšie ako 50 úderov za minútu, môžeme vyselektovať spamerov. Otázkou je, čo ak niekto písal v inom editore a potom to „pastol“. No ale to nie je problém. Pretože si najprv otvoril stránku, zistil že niečo napíše, napísal to v inom editore, a potom sa vrátil a vložil to. Iste mohlo to byť aj ináč, preto ak tejto podmienke príspevok nevyhovie, bude dobré pridať inú kontrolu. Každopádne to pokladám za riešenie, ktoré spameri časom obídu.

7. Klameme nepriateľa

Táto metóda je použiteľná v obmedzených prípadoch. Veď posúďte sami. Začnem otázkou. Čo robí bežný užívateľ? Príde na stránku a číta si. Po čase má nutkanie niečo pripísať. Nájde guestbook a napíše svoj text. Stlačí pridať. Skontroluje čo napísal, poteší sa zo svojho textu a odchádza preč. Metóda je nasledovná. Script prijme text a zobrazí ho medzi príspevkami. Ale len tomu, kto ho pridal. Ostatní návštevníci ho zatiaľ nevidia. Tento príspevok sa zároveň odošle na schválenie emailom (email cez php nájdete napríklad tu activeMailLib 0.1 – www.phpclasses­.org/browse/fi­le/8618.html). Až ho schváli autorizovaná osoba, zobrazí sa tento všetkým. Výhody metódy sú nasledovné:

  • Spamer nevie čo sa deje. Predstavte si že spamer kontroluje účinnosť svojej kampane. Takto môže byť spokojný. Vidí svoje príspevky a ďalej sa tomu nevenuje. Teda ani nehľadá, ako obísť prípadnú ochranu.
  • Obyčajný návštevník je spokojný, pretože si myslí, že je všetko OK.
  • Najdôležitejšie ale je, že tento text neuvidí žiaden vyhľadávač. A to je podstatné v boji so spamom.

Nevýhoda je zjavná. Takýto postup je nepoužiteľný v diskusiách. Ale zase sa táto metóda dá skombinovať s inými tak, aby ste dosiahli dokonalosti.

Príklad ktorý demonštruje použitie, je vlastne modifikovaným riešením z knihy J.Kosek – PHP.

// namet podla J.Kosek: PHP
$subor = "./Diskusie/kniha.txt";

// pridanie do knihy hostov
if (($Email!="") && ($Meno!="") && ($Message2!=""))
{
    // poslem e-mailom
    require_once("activeMailLib.php");
    $email = new activeMailLib();

    // pripravim spravu
    $sprava = "<B>$Meno</B> $wrote " .Date("d.m.Y v H:i"). ":<BR>\n";
    $sprava = $sprava . "E-mail: <A HREF='mailto:$Email'>$Email</A><BR>\n";
    if ($Web!="")
        $sprava = $sprava . "Web: <A HREF='$Web'>$Web</A><BR>\n";
    $sprava = $sprava . "<BLOCKQUOTE><I>\n";
    $sprava = $sprava . NL2BR(HTMLSpecialChars($Message2));
    $sprava = $sprava . "\n</I></BLOCKQUOTE>\n<HR>\n\n";

    $email->checkaddr=false;
    $email->ClearTo();
    $email->To("trsek@hotmail.com");
    $email->From("Guest@trsek.com");
    $email->Subject("Nova sprava na guest www.trsek.com");
    $email->Message($sprava);
    $email->Send();

    // teraz ho zobrazi
    $show="";
}


// zobrazi knihy hostov
if (IsSet($show))
{
    echo("<h4>$add_link</h4><hr>");

    // finta na spamerov - zobrazim ako ze je pridane
    if(IsSet($sprava))
        echo ($sprava);

    // zobrazim zbytok z kniha.txt
    $fp = FOpen($subor, "r");
    FPassThru($fp);
}
else
{
// alebo zobrazi formular pre pridanie odkazu
?>
<H3><?echo $heading?></H3>

<PRE>
<FORM METHOD=POST NAME="AddFile" ACTION="">
Vase meno:  <INPUT NAME=Meno VALUE="<?echo $Meno?>">
Vas e-mail: <INPUT NAME=Email VALUE="<?echo $Email?>">
Vas Web:    <INPUT NAME=Web VALUE="<?echo $Web?>">

<TEXTAREA NAME=Message2 COLS=60 ROWS=8>
</TEXTAREA>

<INPUT TYPE=Submit VALUE="<a href='kniha.php'>Pridat novy odkaz</a>">
</FORM>
</PRE> 

8. Je robot chytrejší ako človek?

Za veľmi dobrú metódu pokladám tú, ktorú zaviedli administrátori diskusie na Jak psát web, a ktorú podrobne popisuje Honza Hučín tu (Funkční javascriptová bariéra na komentářový spam – suplik.petnik­.cz/funkcni-javascriptova-bariera-na-komentarovy-spam-qxxq628.html). V článku je to popísané pekne, ja preto budem len opisovať.

Ide o to položiť návštevníkovi otázku, na ktorú človek pozná odpoveď, ale robot nie. Otázka musí byť taká, aby sa nedala odpoveď zautomatizovať. Pýtate sa napríklad koľko je 2 plus 3. Koľko hlások majú slová a tak. To je dobrý nápad, ale čo ho vylepšiť. Čo tak predvyplniť odpoveď pomocou JavaScriptu? Metóda dostala názov getelementbyid a jej funkčnosť je nasledovná.

Do formulára sa pridá pole s overujúcou otázkou. Potom sa Javascriptom toto pole vyplní a odpoveď aj políčko sa zneviditeľní. Užívateľ (ale aj spamový robot), ktorý má JavaScript vypnutý, toto overovacie políčko vidí. Užívateľ ho dokáže vyplniť. Robot ale nie.

Ukážka kódu:

<form action="zpracuj_komentar.php" method="post">
<!-- zde jsou normální pole formuláře -->
<p id="spamprotirobotum">
Ochrana proti spamu. Kolik je dvakrát tři?
<input type="text" name="robot" value="" id="protirobotum">
</p>
<script>
/* tento skript vloží číslici do příslušného políčka automaticky */
document.getElementById("protirobotum").value="6";
document.getElementById("spamprotirobotum").style.display = "none";
</script>
<p><input type="submit" value="Odeslat"></p>
</form> 

Toľko citát článku. Pri úvahe nad účinnosťou sa ale tlačí na jazyk otázka. Ako dlho? Podľa všetkého bude stačiť upraviť robota tak, aby vedel spracovať JavaScript a máme tu problém zase. Napadá ma kombinácia s už spomínanou metódou „Klameme nepriateľa“. Tým by sme docielili, že spamer by na nič neprišiel a teda ani nepátral po našom scripte. A tých, čo si budú chcieť rypnúť otázkou „Ako dlho teraz?“ poteším. Určite to tiež nie je konečné riešenie.

9. CAPTCHA

Notoricky známe. Zobrazí sa text vo forme obrázka, ktorý musí užívateľ opísať do políčka. Ak hľadáte príklad, pozrite sa sem – captchas.net/sam­ple/php/. Ale ako už reportovali mnohí, metóda je prelomiteľná a spameri už majú potrebné nástroje. A tak sa obrázky čoraz viac zatemňujú a sú čoraz viac nečitateľné. Až nakoniec nastane situácia, že takýto text budú vedieť čítať len roboti.

root_podpora

10. Nech sa robot „bonzne“ sám

Sú aj vtipné riešenia ako toto z php.vrana.cz Autor tu opisuje ako podstrčil robotom skryté tlačidlo, ktoré nazval príznačne „jsem robot“. Vtip je v tom, že toto tlačidlo ľudia nevidia, ale roboti zásadne odosielajú všetky formulárové polia. Skriptík je tu:

<?php
echo "<input type='submit' name='robot' value='Jsem robot' style='display: none;' />\n";
echo "<input type='submit' value='Vložit příspěvek' />\n";
if (!isset($_POST["robot"])) {
    mysql_query("INSERT INTO diskuse (jmeno, zprava, vytvoreno) VALUES ('$_POST[jmeno]', '$_POST[zprava]', NOW())");
}
?>

<form action="prihlaseni.php" method="post">
    <label for="jmeno">Zadejte vaš přihlašovací jméno</label>
        <input type="text" id="jmeno" name="jmeno"> 

11. Jednoduché rady

Prestať používať výstižné názvy políčok a php scriptov. Ak niekto bude mať v root adresári script admin.php, tak si koleduje o problém, nie? Podobne je dnes dôležité nedávať položkám formulára mená ako number, answer, question. Radšej pekne po našom. A úplne najlepšie je dynamicky meniť názvy tak, aby sa pre ne nedal napísať pevný script. Alebo spraviť kombináciu pridať text → náhľad. Teda keď užívateľ text pridá, zobrazí sa náhľad s potvrdzovacím tlačidlom. Po potvrdení náhľadu sa text pridá. To roboti zatiaľ nevedia správne ošetriť. Alebo už aj to?

Záver

  1. Za posledných 6 mesiacov mnohí precitli zo sna, že majú dobre zabezpečené stránky a nevedeli si predstaviť, načo by bol dobrý komentárový spam. Bohužiaľ je tu s nami a stal sa súčasťou siete. Tak ako pri obyčajnom spame aj pri tom komentárovom budeme bojovať s neustále sa zlepšujúcimi technikami spamerov. Takže táto téma vlastne záver ani nemôže mať. Pretože prídu ďalšie techniky a ďalšie ochrany. Ak sa teraz pýtate, aká je najlepšia ochrana, odpoveď je jednoduchá a jasná. Najlepšia ochrana je ručná kontrola príspevkov živým človekom.
  2. Taktiež platí, že ak niekto má výborné riešenie, tak s ním nechodí na svetlo božie. Prečo? Ak je riešenie dobré, bude ho implementovať viac serverov a tým bude zaujímavejšie pre spamera takúto ochranu prelomiť. A verte, že každá sa dá prelomiť.
  3. Predpokladám, že pod článkom bude zaujímavá diskusia a že sa nájdu ľudia, ktorí budú ochotný sa podeliť so svojimi riešeniami. Vopred im ďakujem a sľubujem, že z nich vytvorím ďalšie pokračovanie tohoto článku.

Potýkali jste se se spamem v diskusi?

Byl pro vás článek přínosný?

Autor článku