Captcha v PHP

ohnic

Captcha v PHP
« kdy: 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


Re:Captcha v PHP
« Odpověď #1 kdy: 20. 03. 2012, 12:09:00 »
koukni do error logu webserveru

ohnic

Re:Captcha v PHP
« Odpověď #2 kdy: 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.

McFly

  • *****
  • 560
    • Zobrazit profil
    • E-mail
Re:Captcha v PHP
« Odpověď #3 kdy: 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

ohnic

Re:Captcha v PHP
« Odpověď #4 kdy: 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.


Mirek

Re:Captcha v PHP
« Odpověď #5 kdy: 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?

ohnic

Re:Captcha v PHP
« Odpověď #6 kdy: 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.

Zopper

  • *****
  • 657
    • Zobrazit profil
Re:Captcha v PHP
« Odpověď #7 kdy: 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.

Mirek

Re:Captcha v PHP
« Odpověď #8 kdy: 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.

pogomaniak

Re:Captcha v PHP
« Odpověď #9 kdy: 29. 03. 2012, 19:02:10 »
nezapomněl jsi na session_register("captcha")?

Mmad

Re:Captcha v PHP
« Odpověď #10 kdy: 30. 03. 2012, 15:27:39 »
session_register() je zastaralá (5.3) a odebraná (5.4).

citanus

Re:Captcha v PHP
« Odpověď #11 kdy: 30. 03. 2012, 15:59:04 »
problem je zcela jiste v konkurencim pozadavku na uloziste session..