Autor Zpráva
marek187
Profil
Zdravim, zaujímalo by ma, že aký má zmysel používať funkciu rand() v takomto pripade:

<img src="captcha.php?rand=<?php echo rand();?>

Či to vyhodím alebo nechám, captcha funguje (nevyužíva vygenerované nahodné čísla pomocou metody GET) a nemám ani problémy s cache (napadá ma, že len z tohto dôvodu sa to môže využívať).
Alphard
Profil
Nejlepší by bylo podívat se do toho scriptu captcha.php, jestli tu proměnnou nějak využívá.
Řešit tím cache by ideální nebylo, time() je na tyto účely mnohem lepší.
bestik_63
Profil
se koukni do souboru captcha.php na co se používá parametr $_GET['rand'] a uvidíš hned na co to tam je. Já si myslím že je to generování náhodného textu obrázku, který opisuješ.
marek187
Profil
Alphard:
Nejlepší by bylo podívat se do toho scriptu captcha.php, jestli tu proměnnou nějak využívá.
Tú premennú vôbec nevyužíva (nič na ňu neodvoláva) a captcha funguje aj bez toho spoľahlivo. Je to v takom prípade len riešenie pre prípadné problémy s cache?

Řešit tím cache by ideální nebylo, time() je na tyto účely mnohem lepší.
Ak to má nejaký zmysel, tak to vyrieším radšej funkciou time().
Keeehi
Profil
Pokud ve scriptu captcha.php opravdu nikde není, pak to bude opravdu jen proti keši. Zajímalo by mě ale, jak se pak ověřuje správnost. Pokud to odpověď ukládá do session, pak ta aplikace nemůže fungovat správně ve více oknech.
Pokudje navíc v captcha.php použito rand taky, tak si zaděláváte na problém => captcha je prolomitelná. time nebo microtime je mnohem vhodnější.
marek187
Profil
bestik_63:
Já si myslím že je to generování náhodného textu obrázku, který opisuješ.
Súbor captcha.php generuje náhodny text pomocou funkcie mt_rand() z preddefinovaných znakov.

se koukni do souboru captcha.php na co se používá parametr $_GET['rand'] a uvidíš hned na co to tam je.
$_GET['rand'] som tam tiež hladal, ale nič.


Keeehi:
Pokud to odpověď ukládá do session, pak ta aplikace nemůže fungovat správně ve více oknech.
V tomto máte pravdu, zrovna som to overil a je to tak.

Ako to teda vyriešiť správne? Tu je súbor captcha.php:

<?php 
/*
*
* this code is based on captcha code by Simon Jarvis 
* http://www.white-hat-web-design.co.uk/articles/php-captcha.php
*
* This program is free software; you can redistribute it and/or 
* modify it under the terms of the GNU General Public License 
* as published by the Free Software Foundation
*
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details: 
* http://www.gnu.org/licenses/gpl.html
*/

session_start();
//Settings: You can customize the captcha here
$image_width = 132;
$image_height = 35;
$characters_on_image = 6;
$font = 'font/monofont.ttf';

//The characters that can be used in the CAPTCHA code.
//avoid confusing characters (l 1 and i for example)
$possible_letters = '123456789aAbBcCdDfFgGhHjJkKlLmMnNpOoPqQrRsStTvVwWxXyYzZ';
$random_dots = 20;
$random_lines = 10;
$captcha_text_color="0x919191";
$captcha_noice_color = "0x2ba5cc";

$code = '';


$i = 0;
while ($i < $characters_on_image) { 
$code .= substr($possible_letters, mt_rand(0, strlen($possible_letters)-1), 1);
$i++;
}


$font_size = $image_height * 0.70;
$image = @imagecreate($image_width, $image_height);


/* setting the background, text and noise colours here */
$background_color = imagecolorallocate($image, 255, 255, 255);

$arr_text_color = hexrgb($captcha_text_color);
$text_color = imagecolorallocate($image, $arr_text_color['red'], 
        $arr_text_color['green'], $arr_text_color['blue']);

$arr_noice_color = hexrgb($captcha_noice_color);
$image_noise_color = imagecolorallocate($image, $arr_noice_color['red'], 
        $arr_noice_color['green'], $arr_noice_color['blue']);


/* generating the dots randomly in background */
for( $i=0; $i<$random_dots; $i++ ) {
imagefilledellipse($image, mt_rand(0,$image_width),
 mt_rand(0,$image_height), 2, 3, $image_noise_color);
}


/* generating lines randomly in background of image */
for( $i=0; $i<$random_lines; $i++ ) {
imageline($image, mt_rand(0,$image_width), mt_rand(0,$image_height),
 mt_rand(0,$image_width), mt_rand(0,$image_height), $image_noise_color);
}


/* create a text box and add 6 letters code in it */
$textbox = imagettfbbox($font_size, 0, $font, $code); 
$x = ($image_width - $textbox[4])/2;
$y = ($image_height - $textbox[5])/2;
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font , $code);


/* Show captcha image in the page html page */
header('Content-Type: image/jpeg');// defining the image type to be shown in browser window
imagejpeg($image);//showing the image
imagedestroy($image);//destroying the image instance
$_SESSION['FormCaptcha'] = $code;

function hexrgb ($hexstr)
{
  $int = hexdec($hexstr);

  return array("red" => 0xFF & ($int >> 0x10),
               "green" => 0xFF & ($int >> 0x8),
               "blue" => 0xFF & $int);
}
?>
Keeehi
Profil
Na řádku 84 budeš mít
$_SESSION ['FromCaptcha'][$_GET['rand']] = $code;

Formulář bude vypadat takto:
<?php $random = random(); ?>
<img src="captcha.php?rand=<?php echo $random;?>">
<input type="hidden" name="random" value="<?php echo $random; ?>">

No a ověření je nějak takto
$_SESSION['FormCaptcha'][$_POST["random"]] === $_POST["uzivatelem-vyplnena-hodnota"]

* pro generování náhodných hodnot bych použil něco bezpečnějšího než rand a mt_rand. Třeba api.nette.org/2.0.18/source-Utils.Strings.php.html#361-401
marek187
Profil
Keeehi:
Vynikajúce riešenie, ďakujem za návrh. Teraz to funguje lepšie.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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