Autor | Zpráva | ||
---|---|---|---|
xlifer Profil |
#1 · Zasláno: 26. 5. 2012, 19:11:14 · Upravil/a: Moderátor (editace znemožněna) 29. 5. 2012, 11:18:07
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 |
#2 · Zasláno: 26. 5. 2012, 19:14:52 · Upravil/a: Darker
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 |
#3 · Zasláno: 26. 5. 2012, 19:21:12
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 |
#4 · Zasláno: 26. 5. 2012, 20:18:42
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 |
#5 · Zasláno: 26. 5. 2012, 20:23:58
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 |
#6 · Zasláno: 26. 5. 2012, 21:09:36
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 |
#7 · Zasláno: 26. 5. 2012, 21:36:34
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> |
||
Darker Profil |
#8 · Zasláno: 27. 5. 2012, 00:38:06
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 |
#10 · Zasláno: 29. 5. 2012, 00:47:48
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 |
#11 · Zasláno: 29. 5. 2012, 08:56:44
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 |
#12 · Zasláno: 29. 5. 2012, 11:00:39
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 |
#13 · Zasláno: 29. 5. 2012, 17:14:52
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 |
#14 · Zasláno: 29. 5. 2012, 17:30:13
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 |
#16 · Zasláno: 30. 5. 2012, 12:52:57
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 |
#17 · Zasláno: 30. 5. 2012, 23:12:14
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... |
||
Časová prodleva: 5 dní
|
|||
ShiraNai7 Profil |
#18 · Zasláno: 4. 6. 2012, 15:08:54
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 |
#19 · Zasláno: 4. 6. 2012, 17:02:43
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] |
||
ShiraNai7 Profil |
#20 · Zasláno: 4. 6. 2012, 17:25:12
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 |
#21 · Zasláno: 4. 6. 2012, 17:33:25
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 |
#22 · Zasláno: 4. 6. 2012, 17:41:52
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 |
#24 · Zasláno: 5. 6. 2012, 21:33:43
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 |
#25 · Zasláno: 5. 6. 2012, 21:36:25
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 |
#26 · Zasláno: 5. 6. 2012, 23:05:53
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). |
||
Časová prodleva: 12 let
|
0