Zjistila jsem, že obrázková captcha se setkává se značnou nevolí, nevraživostí až nepřátelstvím. Na jednu stranu to chápu, protože někdy s ní mám také potíže. Na druhou stranu je potřeba se chránit před útoky spamujících robotů. Tak tomu v dnešní době, bohužel, je. Tak jsem zkusila v systému nastavit captchu textovou, ale ta původní není pro roboty žádnou překážkou, spíše naopak. Tak jsem to zkusila trochu jinak 
Pro robota není snad snadnější problém, než si přečíst rovnici „1+1=?“ a správně doplnit znak „2“. Pokud však systém bude místo „2“ chtít napsat „dva“, tak je to pro roboty, zatím, nepřekonatelný problém. Upravená captcha běží asi dva týdny (v době psaní článku) a zatím se nenašel robot, který by ji dokázal překonat.
Jak tedy změnu udělat?
Je potřeba najít tento soubor: XOOPS_ROOT/class/captcha/text.php, který se stará právě o tento režim ověřovaní. Zároveň bude potřeba v souboru XOOPS_ROOT/class/captcha/config.php nastavit proměnnou 'mode' => 'text'. V souboru text.php je třeba najít tuto část:
function loadText()
{
$val_a = rand(0, 9);
$val_b = rand(0, 9);
if ($val_a > $val_b) {
$expression = "{$val_a} - {$val_b} = ?";
$this->code = $val_a - $val_b;
} else {
$expression = "{$val_a} + {$val_b} = ?";
$this->code = $val_a + $val_b;
}
return '<span style="font-style: normal; font-weight: bold; font-size: 100%; font-color: #333; border: 1px solid #333; padding: 1px 5px;">'.$expression.'</span>';
}
a nahradit ji touto upravenou funkcí:
function loadText()
{
$vysledek[0] = "nula";
$vysledek[1] = "jedna";
$vysledek[2] = "dva";
$vysledek[3] = "tři";
$vysledek[4] = "čtyři";
$vysledek[5] = "pět";
$vysledek[6] = "šest";
$vysledek[7] = "sedm";
$vysledek[8] = "osm";
$vysledek[9] = "devět";
$vysledek[10] = "deset";
$vysledek[11] = "jedenáct";
$vysledek[12] = "dvanáct";
$vysledek[13] = "třináct";
$vysledek[14] = "čtrnáct";
$vysledek[15] = "patnáct";
$vysledek[16] = "šestnáct";
$vysledek[17] = "sedmnáct";
$vysledek[18] = "osmnáct";
$val_a = rand(0, 9);
$val_b = rand(0, 9);
if ($val_a > $val_b) {
$expression = "{$val_a} - {$val_b} = ? (slovem)";
$this->code = $vysledek[($val_a - $val_b)];
} else {
$expression = "{$val_a} + {$val_b} = ? (slovem)";
$this->code = $vysledek[($val_a + $val_b)];
}
return '<span style="font-style: normal; font-weight: bold; font-size: 100%; font-color: #333; border: 1px solid #333; padding: 1px 5px;">'.$expression.'</span>';
}
No a to je vlastně celé, od tohoto okamžiku bude XOOPS při ověřování chtít místo číslice slovo a bude od robotů klid. Alespoň nějakou dobu. Je však otázkou, jak bude tato úprava fungovat v jiných jazycích, než je čeština, protože ta je, přeci jenom, poněkud exotická.
Pokud má někdo pocit, že se dá funkce naprogramovat jinak a lépe, tak má zcela jistě pravdu. K výsledku vede mnoho cest a tato je asi nejjednodušší. A je plně funkční. Pokud máte jiné řešení, můžete se o něj podělit v komentářích 
|