Autor Zpráva
Radim24
Profil *
Ochrana proti robotům


Ahoj. V tomhle příspěvku bych se vás chtěl na něco zeptat a taky prezentovat jednu svou metodu. Zajímá mě váš názor.

Jde mi o roboty, kteří jsou schopni aktivovat mou vyrobený skript a zneužít ho k automatickému odesílání nevyžádaných spamů. Zajímalo by mě s čím takový robot pracuje. Jak to dělá. To proto, aby ta ochrana, kterou se snažím udělat byla účinná ale taky, abych tam nedával něco, co tam být nemusí.

Takže moje otázky k robotům:
- Je to tak, že někdo si např. uloží na svém počítači moji stránku – formulář, ten upraví podle svých potřeb, aby formulář zautomatizoval? Nebo je ještě jiná metoda?
- Do kterých částí kódu je schopen uživatel zasáhnout. Může to udělat třeba tak, že si přidá vlastní javascript a tento zautomatizovaný formulář potom směruje odeslání dat na moje stránky?

A teď co se chystám zavést jako ochranu pro svoje stránky. Nejdříve jsem uvažoval o tom, že před odeslání např. v diskusi bude dole políčko, které musí uživatel zaškrtnout. Pokud hacker může vytvořit vlastní javascript, pak taky může toto políčko automaticky najít a zaškrtnout. Ovšem, poklud vytvořím proměnlivý počet skrytých políček např. 4-8 a mezi nimi bude jedno viditelné, pak to tak jednoduché mít nebude. Musí zaškrtnout to správné, ale to ví jen vnější pozorovatel. Toto by se vypočítávalo ze vzorce platný pro daný den. Vypočítalo by se které políčko má být zaškrtnuté a které být nesmí. Pak jde o to, že hacker nesmí být schopen najít toto políčko ve skriptu. Takže bych to trochu zesložitil. Hned na začátku bych automaticky vytvořil css soubor, kde bude 4-8 tříd, pro každý prvek jiná s náhodným řetězcem, jen jeden bude pro ověřovací políčko. Tak by hacker neměl být schopen z kódu zjistit, která třída je visible, a které třídy jsou invisible. To ovšem předpokládá, že hacker není schopen při automatizaci javascriptem nahlédnout do css souboru - myslím číst z něj data automaticky.

Řekněte mi zda uvažuju správně a jestli to není zbytečně složité. Díky
Meldo
Profil
Zbytočne zložité. Ak už takto zložitý script tak jedine tak, aby uzivatel nemusel vobec zasahovat.
Radim24
Profil *
A včem je to složité? Potřebuju vědět zda ten hacker může zjístit jaký jsem mu nastavil styl a zda může javascriptem zaškrtnout to políčko.
Meldo
Profil
A co namiesto toho vygenerovat pomocou GD kniznice cislo a nech ho uzivatel doplni do formulara. Je to ovela jednoduchsie. Par riadkov kodu. Ake to bude cislo to spamer nezisti, pretoze to bude generovane napr. phpckom. Musel by sa napojit priamo na server. V tom pripade by som ale zmenil hosting.
Meldo
Profil
Ovela viac sa mi ale paci ochrana, ktoru tu zaviedol Yuhu. Vobec to neni poznat a je to velmi efektivne. Skus si vypnut javascript a uvidis.
pavel prochazka.zde.cz
Profil *
A jaka je to ochrana, muzes ji popsat.... Taky buch mel zajem o takovou ochranu kde neni potreba zatezovat uzivalele....
Meldo
Profil
Neviem ako to presne funguje. Nikdy som to nepotreboval pouzit. Preto ti hovorim, pozri sa tu do zdrojakov a vypni si javascript a uvidis.
gaminn
Profil *
pavel prochazka.zde.cz
Je to založeno na javascriptu - pokud ho máš zapnutý, do skrytého inputu se javascriptem vloží určitá hodnota. Pokud ho zapnutý nemáš, input se zobrazí a ty jsi vyzván k manuálnímu zadání hodnoty.
luk@s
Profil *
Taky ve svych projektech pouzivam stejnou metodu jako Yuhu, s tim rozdilem, ze jeste kontroluji za jakou dobu byl formular odeslan. Pokud vyplneni udaju a odeslani trvalo cca 2 vteriny, tak vim, ze jde o nejakeho robota, protoze uzivatel za 2 vteriny nestihne vyplnit vsechna potrebna pole a formular odeslat.
Meldo
Profil
luk@s
jeste kontroluji za jakou dobu byl formular odeslan. Pokud vyplneni udaju a odeslani trvalo cca 2 vteriny, tak vim, ze jde o nejakeho robota, protoze uzivatel za 2 vteriny nestihne vyplnit vsechna potrebna pole a formular odeslat.

Hmm. Tak to je asi ta najlepsia a najjednoduchsia(co sa vytvorenia tyka) ochrana pred spamom o akej som pocul.
DreamCZ
Profil
Ja si menim podle hodiny a datumu jmeno pole, ktere se odesila... a pokud je blbe jmeno pole, formular se neodesle a hodi chybu a od ty doby mam pokoj. :-) Imho je to vhodny pro kontaktni formulare apod... ktery se az tak casto nepouzivaj, ale na strankach jsou potreba :-)
gaminn
Profil *
DreamCZ
Jak máš vyřešeno to, že v jednu hodinu se přiřadí nějaké jméno pole a jinou hodinu, při platnosti jiného jména pole, se formulář odešle?
Joker
Profil
DreamCZ
Ale pokud skript navštíví stránku a automaticky vyplní všechna pole co najde nějakými hodnotami, tak to fungovat nebude (robot dostane pole s vygenerovaným jménem, něco do něj vyplní a pak to odešle)

Já jsem taky přemýšlel o protispamové ochraně a myslím, že porovnávání času bude nejspolehlivější.
Na odesílací stránce se do určité session proměnné uloží časové razítko.
Na ukládací stránce se zkontroluje existence té proměnné v session. Pokud neexistuje, příspěvek se neodešle. Pokud existuje, udělá se rozdíl a pokud ten rozdíl je menší než nějaký limit, příspěvek se neodešle.

Tato metoda mi přijde jako neprůstřelná. Proměnné ukládané v session nemůže klient nijak ovlivnit, takže může leda počkat. Jenže hlavní úkol spamovacího robota je udělat co nejvíce pokusů o odeslání příspěvků v co nejkratším čase. Efektivita spamovacího robota řádově klesá.

Možná bych ještě přidal logování těch odmítnutých příspěvků, Na základě toho by potom šlo ověřit úspěšnost a případně aplikovat další omezení (získat klíčová slova, IP adresy apod.)
Radim24
Profil *
Omlouvám se za zpoždění, ale ještě se ozvu. Proč jsem volil zaškrtnout políčko místo opisování čísla? Jednak to méně otravuje a hlavně, když to člověk blbě opíše, třeba kvůli tomu že má problém se zrakem, tak ho to nebude obtěžovat. Abych se přiznal, opisovat GD čísla vyloženě nesnáším, obzvlášť když by se jednalo o ochranu při odesílání příspěvku do diskuse.
Radim24
Profil *
Děkuji všem přispívajícím. Jsou to zajímavé příspěvky. Dříve jsem si myslel, že jediná možná varianta je udělat to přes GD. Já se snažím použití GD vyhnout, protože si myslím, že existuje rychlejší řešení.

Varianta, která je použitá na těchto stránkách je zajímavá, i když jsem ji neviděl, neboť na tomto pc nemám oprávnění vypnout javascript. Ale pokud zavedete otázku typu „Kolik má rok dní“ nebo „Kolik dní má dnešní měsíc“, tak robot odpověď nezná a je to elegantní řešení. Tady v tom zdrojáku je input value=365 - ta hodnota toho políčka se pokaždé mění? Ale když je už předem vyplněna, tak nemá žádný smysl, ne?

Líbí se mi řešení, které představuje Joker. Akorád zde je třeba zase používat databázi a tabulku, která bude nějakou dobu ukládat sessions i nezaregistrovaných uživatelů. Ale je to komfortnější. Teď je otázka nakolik nastavit časový interval. V diskusi někdy odpovídám už za pár vteřin, když je příspěvek krátký, a nebo jenom okopíruji již předem připravený příspěvek, a to je jen pár vteřin (asi 4s). A co když někdo vyvine robota, který poběží na několika stránkách – navštíví deset stránek současně, na každé počká deset vteřin a pak odešle příspěvek, to by vyzrál :-) Nebo se spustí na více počítačích najednou, takže mu čekání vadit nebude :-)

Na té možnosti, co jsem vymyslel já se mi líbí to, že když robot zaškrtne nesprávná políčka, která uživatel nevidí, tak se data neuloží. Uživatel by nemusel nic opisovat, ani používat GD knihovnu, a dokonce ani databázi.

Jedna věc mi ještě vrtá hlavou. Pokud robot může vyplnit všechna políčka formuláře, pak může taky javascriptem zjistit, co je uvnitř zdrojáku a podle toho se přizpůsobit.
DreamCZ
Profil
DreamCZ
Ale pokud skript navštíví stránku a automaticky vyplní všechna pole co najde nějakými hodnotami, tak to fungovat nebude (robot dostane pole s vygenerovaným jménem, něco do něj vyplní a pak to odešle)


2Joker: to je sice pravda, ale od ty doby co jsem si to zprovoznil mi neprisel z toho formulare ani jeden spam, tudiz "robot" nefunguje na tomhle principu podle me nejdriv sbira a pak posila... imho mozna se pletu, ale to by mi spamy chodili vesele dal coz se nedeje... :-)
šufánek
Profil
Zpátky k původnímu tématu diskuse:

Radim24: jakým způsobem zajistíš, aby spammer "neviděl" do CSS? IMHO to nejde. Tvoje metoda pravděpodobně bude fungovat - proto že je celkem originální a roboti na ní nebudou připraveni. Má však daleko k tomu, aby byla neprůstřelná. Navrhoval bych možná o něco "lepší" řešení. Checkboxy neskrývej, ale pozicuj je tak, aby nebyly vidět - třeba left:-100px; nebo obě metody kombinuj.

Joker Efektivita spamovacího robota řádově klesá.
Robot nemusí být omezen počtem spojení, ale tokem dat. Pokud by tedy skutečně projížděl stránky s timeoutem třeba 15s (a já jsem přesvědčenej, že už dneska to některý roboti dělaj), bude mít při stejným "výkonu" v jeden moment víc spojení, ale datovej tok bude stejnej. Efektivita tudíž neklesá a neprůstřelnost
je ta tam.

Muj (prozatimní) závěr: Co se neprůstřelnosti týče, stále vede gd, pokud však mám stránku s malou návštěvností, postačí i jiný řešení, bude-li dostatečně originální.
Radim24
Profil *
Šufánkovi
No, máš pravdu. Když někdo vypne CSS, tak jsem nahranej. Ale mohl bych to řešit tím, že nastavím výšku na 0. Např: <DIV style="height:0px"><INPUT tzpe-hidden></DIV>. Fungovalo by to?
Radim24
Profil *
Oprava:
<DIV style="height:0px"><INPUT type=checkbox></DIV>.
šufánek
Profil
Radim24: záleží na "inteligenci" těch robotů. dobře naprogramovanej robot prostě pozná, jestli objekt viditelnej je nebo neni. Bude totiž mít vždy k dispozici stejný informace, jako uživatel. Jakýkoliv hrátky s CSS jsou hrou s otevřenýma kartama. Můžeš robotovi práci ztížit, ale nikdy nemůžeš vyloučit že to obejde.
Anonymní
Profil *
aky zmysel ma skryte tlacitko? bot ho akoze "uvidi" a stlaci? lebo podla mna by to malo byt naopak, ludia by mali zaskrtavat nie? ked clovek neuvidi a bot tiez tak naco je to dobre... pff
Joker
Profil
Radim24
Líbí se mi řešení, které představuje Joker. Akorád zde je třeba zase používat databázi a tabulku, která bude nějakou dobu ukládat sessions i nezaregistrovaných uživatelů.
Nebylo. Aplikace toho řešení je velice jednoduchá: pokud máte na stránkách už nějakou registraci, máte tam nejspíš session_start() kvůli registrovaným uživatelům. Funkce session_start() ale vytvoří session i pro neregistrované uživatele, takže session už máme tak jako tak. No a pak stačí udělat:
na konci odesílacího formuláře:
$_SESSION["t"] = time();

a na začátku kontrolujícího formuláře:
$cas = intval($_SESSION["t"]);
if($cas==0) die("Odmítám odeslat");
$rozdil = time() - $cas;
if($rozdil < $limit) die(Odmítám odeslat);

To je všechno. Jednoduché, (IMHO) účinné a bez přidání čehokoliv na straně uživatele
mila
Profil
Přijde mi, že bude fungovat každé originální řešení. Roboti jednou na kvantitu a nikdo se ve vašich zdrojácích hrabat nebude.
Pokud ale děláte hlasování v superstar, tak asi nebude fungovat nic.
Acci
Profil
šufánek
Naprogramovat spamovacího robota rozumějící CSS je takřka nemožná a taky zbytečné, když se dá najít mnoho nechráněných knih a diskusních fór.
šufánek
Profil
Acci - Nemyslím si, že by to bylo bůhvíjak nemožné - mohll by být třeba jednoduše založen na jádru nějakého prohlížeče, a checkovat skutečnou optickou "viditelnost". S tím, že se s tím dneska těžko bude někdo dělat ale naprosto souhlasím. Upozorňoval jsem na tuto možnost jenom proto, že tu někteří hlásali neprůstřelnost některých metod.

Co se Jokerovy metody týče, stále mi připadá mnohem méně bezpečná, než ta s css. Ale eleganci jí upřít nelze, a většinu robotů nejspíš ošálí. Jak praví mila - roboti jedou na kvantitu, ale tetnhle trik nejspíš přeci jen nebude tak originální, aby ho neuměli obejít.
Radim24
Profil *
Jokere,
Session cookie si klient může upravit...
Anonymní
Profil *
Ahoj

Mam na strankach take miniBB forum a teke mam problem s roboty.

Snažil jsem se upravit sablony a kod (JS reseni jako je v teto diskusi), ale nenasel jsem kde to je potreba vlozit. Pusobi to na me dost neprehledne. Muzete mi prisim nekdo pomoct a rict do jakych souboru zapsat rozsireni odesilaneho formulare a do jakych kontrolu po odeslani?

David
Bubák
Profil
www.root.cz/clanky/captcha-negativa-a-sposoby-prelomenia/
Toto téma je uzamčeno. Odpověď nelze zaslat.