Autor Zpráva
xlifer
Profil
Chci do formuláře zavést na odesilací tlačitko událost onclick s odkazem na funkci, které uloží zakódovaný přiznak do proměnné ve formuláři , že na tlačitko bylo fyzicky "kliknuto". Přemýšlím, zda je to spolehlivé? Následně při zpracování formuláře ve skritpu, bych si rozkódoval příznak kliknutí a akci bych provedl. Je to vlastně taková ochrana proti odeslání robotem, ale nevím zda nejde událost onclick podvrhnout robotama?
Darker
Profil
Všechno co posíláš klientovi (javascript, cookie ochranné kódy) se dá podvrhnout. Ale náhodný robot to pravděpodobně nedokáže (podobně myslím funguje ochrana tady na diskusi).


Pokud se někdo rozhodne ti tvojí stránku vyspamovat tato ochrana ti nepomůže.
ShiraNai7
Profil
Darker:
Všechno co posíláš klientovi (javascript, cookie ochranné kódy) se dá podvrhnout.

Spíš "všechno, co klient posílá na server".
xlifer
Profil
Jde mi spíše o základní ochranu aspoň pro náhodné roboty jak píše Darker. Je jasný, že lze všechno obejít, když bude někdo chtít, tak vyspamuje, ale lze o to udělat aspoň nějakou překážku. Tohle snad může aspoň trochu pomoci a je to lepší než obtěžovat opisováním kódu nebo součtu, apod. To lze mimo jiné, také objeít, když už jsem u toho.
Alphard
Profil
Ani to není potřeba vázat na onclick, roboti obvykle neumí js. Stačí do hidden pole javascriptem něco vložit a pak to kontrolovat.
xlifer
Profil
Alphard:

"Stačí do hidden pole javascriptem něco vložit a pak to kontrolovat."

A jak vložím do hidden pole jinak než nějakou události vyvolanou při stisknutí tlačítka o které mi jde primárně jako o vyvolanou akci uživatelem? Chci to navázat právě na onclick, protože mi to přijde nejvíce vhodné. Když to vložím javascriptem někde na začátku, tak to nebude mít efekt.
Alphard
Profil
Formulář lze odeslat třeba i enterem, onclick tedy nepovažuji za vhodný a raději bych použil onsubmit. Nicméně nechápu, proč to chcete vázat na nějakou událost, přece stačí jediný řádek js, který do skrytého pole něco vloží.

<div>Jaká je odpověď na základní otázku života, vesmíru a vůbec? <input type="text" name="kontrolni_token" id="kontrolni_token"></div>
<script>document.getElementById('kontrolni_token').value  = "42";</script>
Ještě bylo dobré v případě dostupného js to pole skrýt (proto jsem nepoužil hidden), ale to zpaměti neumím.
Darker
Profil
V případě používání JS lze klidně celé pole formuláři přiřadit přes DOM jako element. Nicméně přestože uživatelé nepoužívající javascript už téměř neexistují, doporučil bych tam pro ně dát CAPTCHU která se napak javascriptem skryje (nebo bude v <noscript>). Můžeš pak mít podmůnku, kde alespoň jedno zpolí (captcha, javascript kontrola) musí být správně vyplněno.

ShiraNai7:
Dík za opravu, sestavení té věty jsem nějak nezvládl. Měl jsem namysli, že všechna přijímaná data se dají korektně zpracovat. Když se rozhodnu zatopit webu s kontrolou typu „sečtěte dvě čísla“, udělám to. Přijdu na to jak jsou zakódovaná ve skriptu a bude. Ale náhodný robot na takovéhle operace není stavěný.
xlifer
Profil
Alphard:

Až při ukázce kódu jsem si uvědomil, že je to takhle skutečně lepší a jednoduší než to tam cpát přes událost i když by vykonala vlastně to samé. Mě nedocházelo, že vlastně ten JS bude na straně serveru ve skriptu, nikoliv robota jako klienta :-) Když bude robot připravován na skutečný a cílený útok, tak si samozřejmě ten příznak může připravit, takže je to opravdu řešení pro náhodné roboty. I když nutno dodat, že pokud ten příznak bude mít velmi složitý algoritmus (propojený např. ješte na kontrolní token do databáze), tak lze nasadit vyšší level a nepůjde už vůbec jednoduše odhadnout, že jedna a jedna jsou dvě...
xlifer
Profil
A jaký máte názor na řešení. Do formuláře dám skryté pole, které naplním přes JS jak psal Alphard. Naplním to pole náhodně vygenerovanou hodnotou, kterou současně uložím do SESSION. Ve skriptu zpracování, který odkazuji zvlášt, zkontroluji zda skryté pole je shodné s hodnotou uloženou v SESSION? Přijde mi to jako zajimavé řešení i dobré zabepečení, které nevím zda lze obejít. Ješte podotýkam, že při každém zobrazení stránky s formulářem se hodnota přegeneruje na novou, takže nezůstává uložená stejná, rovněž po odeslání formuláře současně SESSION smažu.
ShiraNai7
Profil
Uložení aktuálních cookies (tedy i platného ID session) a jejich následné odeslání s dalším požadavkem (odeslání formuláře) je snad nejvíc banální věc co může robot automaticky dělat :)
1Pupik1989
Profil
Já to tak na prezentacích, kde je "napište nám vzkaz", tak dělám, akorát string obrátím. To je ale spíš lenost, u větších webů bych si to nedovolil.
xlifer
Profil
ShiraNai7:

No, myslel jsem, že to bude více "cool", ale když jste to tak sestřelili, tak asi né. A co kdybych ověřovací token generoval a schoval do databáze? Tzn. vytvořím token záznam v db a přes formulář odešlu ticket, který bude jako kontrolní kód tokenu.
Darker
Profil
xlifer:
A co kdybych ověřovací token generoval a schoval do databáze?
To se dělá. Jde o to, jestli to za tu námahu stojí.
No a samozřejmě, není problém ten token z HTML přečíst, ale opět by šlo o specializaci.
xlifer
Profil
Darker:

To se dělá. Jde o to, jestli to za tu námahu stojí.
No tak ja myslím, že to zase taková námaha není nebo o nic větší než zavést cpatchu. Nakonec i captchu lze prolomit a speciální roboti umí kód už i přečíst co jsem někde četl.

No a samozřejmě, není problém ten token z HTML přečíst, ale opět by šlo o specializaci.
Tak jasně, že všechno jde obejít, otázka je co je nejvíce spolehlivé nebo odsvědčené třeba i na specializaci?
Ugo
Profil
teď naposled když jsem dělal "ochranu" před roboty, tak jsem použil 2 pole schovaná javascriptem, jedno má popis "toto pole nevyplňujte" a name třeba email a druhý má před sebou klasicky vygenerovanej text a předvyplňuje se javascriptem, čili něco jako "opište: 12345". nevím jak hluboce je to spolehlivé, obejít to speciálním robotem je otázka 5 minut, ale doufám že většinu běžnejch kousků to odradí, žel nemám žádné stránky na které by si nějaký robot zasedl abych to vyzkoušel
xlifer
Profil
Ugo:

A "schovaná pole javascriptem" máte na mysli display: none ?

Mě totiž napadlo v této souvislosti takové pole vytvořit v JS přes appendChild(); možná by to bylo zase složitější na čtení chytřejších robotů třeba...
ShiraNai7
Profil
xlifer:
A "schovaná pole javascriptem" máte na mysli display: none ?
To určitě ne.

Mě totiž napadlo v této souvislosti takové pole vytvořit v JS přes appendChild(); možná by to bylo zase složitější na čtení chytřejších robotů třeba...
To by mohlo fungovat. Ale pro uživatele bez JS alespoň zobrazit upozornění (je jich minimum). (<noscript>)
Joker
Profil
xlifer:
Mě totiž napadlo v této souvislosti takové pole vytvořit v JS přes appendChild();
Ovšem pořád bude potřeba něco pro uživatele bez JS (nebo třeba pro případ, že ten JS nezafunguje podle očekávání).

ShiraNai7:
Ale pro uživatele bez JS alespoň zobrazit upozornění
Paráda, takže by formulář vypadal asi takhle:
Zadejte svůj příspěvek
Nemáte Javascript, příspěvek nebude uložen!
Vaše jméno:       _________________
Nadpis příspěvku: _________________
Text příspěvku:   _________________
[Odeslat]
To děkuju pěkně, zejména když uvážíme pozornost, s jakou návštěvníci ty okolní texty čtou (o čemž se tady na diskusi leckdy můžeme přesvědčit).
ShiraNai7
Profil
Joker:
Paráda, takže by formulář vypadal asi takhle:

Žádná paráda. Pouze reaguji na jeho nápad s appendChild(). Přijatelné provedení je na něm, např:

  <noscript>
    Lidi bez JS mame na haku.
  </noscript>
  
  <form class="requireJs">
    
    <!-- formular zde -->
    
  </form>
  
  <noscript>
    <style type="text/css">
    .requireJs {display: none;}
    </style>
  </noscript>

Než podmiňovat formulář javascriptem, doporučoval bych spíš jednu z možností:

• klasickou CAPTCHu
• nebo primitivní příklad ve stylu: 1 + 2 = ? (náhodně generováno)

Proti nespecializovaným robotům by to mělo bohatě stačit.
Joker
Profil
ShiraNai7:
To uvedené provedení neskryje políčko v případě, že uživatel nemá zapnuté CSS.

Myslím, že mnohem lepší je mít funkční formulář i pro lidi bez JS.
Například tahle diskuse má políčko vložené úplně normálně a jen ho pak přes JS skryje (display:none).
Nebo může JS původní pole odebrat a vložit si svoje, takhle by se dalo rozlišovat mezi uživateli s JS a bez JS, kdyby to bylo potřeba.
ShiraNai7
Profil
Joker:

Myslím, že mnohem lepší je mít funkční formulář i pro lidi bez JS.
Ano, to přece tvrdím na konci svého příspěvku.

To uvedené provedení neskryje políčko v případě, že uživatel nemá zapnuté CSS.
% normálních uživatelů s vypnutým CSS a zároveň i JavaScriptem je určitě nepatrné.
xlifer
Profil
ShiraNai7:
• klasickou CAPTCHu
• nebo primitivní příklad ve stylu: 1 + 2 = ? (náhodně generováno)

V čem je vlastně klasická CAPTCHa, tak dokonalá oproti primitivnímu stylu 1 + 2 = ?

A k zamyšelní ...

Začínám mít pocit, že všechny řešení jsou k ničemu :-) Protože všechno lze prlomit a obětí jsou opět a zase jen uživatelé, kteří musí opisovat kódy nebo opakovat matematiku. Možná jak se říká, že v jednoduchosti je dokonalost, tak skryté pole JS mi přijde jako nejvhodnější řešení, které obtěžuje pouze miniální procento uživatelů, kteří mají vypnuté JS. Ja osobně nechápu, proč by si někdo měl vypínat JS, když bez JS dnes na webu skoro 99% nejede.
jenikkozak
Profil
xlifer:
Začínám mít pocit, že všechny řešení jsou k ničemu :-)
To je úvaha chybná. V životě už to tak bývá, že ne všechno vychází na 100 %. Ovšem je třeba si uvědomit, že i 0,5 % je víc než 0.
Můžeš jednotlivá řešení kombinovat, čímž se budeš úplné úspěšnosti přibližovat. Třeba tak, že pomocí skrývání políčka JS rozlišíš, zda má klient zapnutý JS. Pokud ne, je větší pravděpodobnost, že se jedná o robota. Můžeš mu proto jeho příspěvek zobrazit v náhledu a umožnit mu, aby jej vložil znovu. (Většina robotů umí poslat formulář jen jednou, nepočítají s náhledem.) Dále můžeš třeba udělat filtr nevhodných slov a podle toho také spamy označovat.
Ve většině případů malých a středně velkých webů stačí řešení opravdu jen jednoduché.

V čem je vlastně klasická CAPTCHa, tak dokonalá oproti primitivnímu stylu 1 + 2 = ?
Zde není namístě bavit se o dokonalosti. Její výhoda je v tom, že má větší množinu zadávaných znaků (než jsou výsledky číselných počtů), takže je menší pravděpodobnost, že robot trefí správnou kombinaci.
ShiraNai7
Profil
xlifer:
V čem je vlastně klasická CAPTCHa, tak dokonalá oproti primitivnímu sytlu 1 + 2 = ?
Například v tom, že se přes ni nedostanou ani specializovaní spamboti? (Pokud není vyloženě špatná - ve stylu černý text na bílém pozadí).

opakovat matematiku
Pro počty s čísly o jedné cifře?
Chamurappi
Profil
Reaguji na xlifera:
osobně nechápu, proč by si někdo měl vypínat JS
Je to nejsnazší způsob, jak se zbavit otravných a zbytečných animací…

bez JS dnes na webu skoro 99% nejede
To, že 99 % webů JavaScript využívá, neznamená, že bez něj vůbec nejedou. Jinak viz zapnutí javascriptu skriptem.

V čem je vlastně klasická CAPTCHa, tak dokonalá
Špatně se prolamuje cíleným útokem. Primitivní příklad může nepřítel tvé stránky jednodušeji spočítat (vyjde 3).

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: