Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ohnic 20. 03. 2012, 12:00:27

Název: Captcha v PHP
Přispěvatel: ohnic 20. 03. 2012, 12:00:27
Mám problém s captchou v PHP, Joomla.

Představte si následující fragment kódu:
...
$code = generateCode();
generateImage($code);   // pouziva GD, nakonec zavola: header('Content-type: image/png'); imagepng();
$_SESSION['captcha'] = $code;
exit();

(někde předtím je taky session_start();)

Session se ukládá do databáze. Když se tenhle kód zavolá při načítání stránky (tedy v jednom TCP spojení se zbytkem stránky), data do session se neuloží (přesněji session zůstane nezměněna - jsou v ní i jiné věci), ani se neuloží do jíne session (ověřeno dotazem do DB). Když pak user na stránce nechá vygenerovat novy kód (generování obrázku v extra TCP spojení), data do session se uloží.

Měl by někdo tip, v čem by mohl byt problém?

Díky moc.

Ohnic
Název: Re:Captcha v PHP
Přispěvatel: Tomas Matejicek 20. 03. 2012, 12:09:00
koukni do error logu webserveru
Název: Re:Captcha v PHP
Přispěvatel: ohnic 20. 03. 2012, 12:18:44
V error logu nic není. Tedy nic relevantního.

Ještě (možná) důležitá informace, na kterou jsem předtím zapomněl: Já vyvíjím na Linuxu a mě vše funguje dobře (Firefox). Problém se vyskytuje na widlích (XP, 7, prohlížeče IE8, IE9, Firefox, Opera). Na widlích jsem Wiresharkem ověřoval, že na server jsou stejné cookies, a fakt jdou.
Název: Re:Captcha v PHP
Přispěvatel: McFly 20. 03. 2012, 19:46:54
Teď mi to moc nemyslí, ale co přidat k tomu headeru ještě další:

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
Název: Re:Captcha v PHP
Přispěvatel: ohnic 20. 03. 2012, 20:59:57
Díky za reakci. Něco takového tam mám - v tom problém není. Problém je, že se ta captcha neukládá do session. Pro jistotu jsem tam přidal ukládání do souboru, a to se ukládalo, takže ten obrázek se skutečně generoval. Jen se neuložilo do session.
Název: Re:Captcha v PHP
Přispěvatel: Mirek 21. 03. 2012, 09:09:58
a pokud se to ukládá do db, nemůže tam být nějaká kolize, když v tom samém okamžiku ukládá ta základní stránka i ten obrázek do té session?
Název: Re:Captcha v PHP
Přispěvatel: ohnic 21. 03. 2012, 12:16:26
Díky za reakci.
To je možné. Nakonec jsem to obešel tak, že to neukládám do session ale do vlastní tabulky. Není to moc čisté, ale alespoň to funguje.
Název: Re:Captcha v PHP
Přispěvatel: Jan Ťulák 29. 03. 2012, 09:30:20
Dovolím si jiný úhel pohledu. Před nějakou dobou jsem taky řešil implementaci ochrany proti spamu, ale s ohledem na přívětivost se mi osvědčilo uživatelsky přístupnější řešení otázkami, jako je i tady na root. Sebesložitější obrázkové captchy se dají velmi snadno louskat v indii po desítkách za dolar a kolikrát i skutečný uživatel musí obrázek opisovat několikrát. O tom, že byste měl přidat i audiostopu pro nevidomé/slabozraké nemluvě.

Otázky typu "první měsíc v roce", nebo "jedna plus jedna číslicí" jsou dostatečně odolné, dokud nebudou vyhledávače schopny generovat odpovědi na otázky. (Jen si ověřte, že wolfram alpha na otázku správně neodpoví :D).

Na druhou stranu, obrázkovou captchu inteligentní člověk dokáže vyplnit, i pokud je text stránky v japonštině, případně prohnaný automatickým překladačem. Je tedy otázka, co captchou chráníte a s jakými jazykovými schopnostmi návštěvníků počítáte.
Název: Re:Captcha v PHP
Přispěvatel: Mirek 29. 03. 2012, 11:13:47
S předchozím příspěvkem souhlasím, jen bych dodal, že já mám diskuzi bez spamu a nemám tam ani captchu ani žádné otázky, ani povinný náhled před uložením. Jde to řešit i bez jakéhokoliv pruzení lidí nějakými nesmysly, ale domnívám se, že je to o otázce jedinečnosti ochrany, pak se totiž spamerům nevyplatí věnovat čas prolomení této ochrany, když je jen na jednom webu.
Název: Re:Captcha v PHP
Přispěvatel: pogomaniak 29. 03. 2012, 19:02:10
nezapomněl jsi na session_register("captcha")?
Název: Re:Captcha v PHP
Přispěvatel: Mmad 30. 03. 2012, 15:27:39
session_register() je zastaralá (5.3) a odebraná (5.4).
Název: Re:Captcha v PHP
Přispěvatel: citanus 30. 03. 2012, 15:59:04
problem je zcela jiste v konkurencim pozadavku na uloziste session..