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 |
#2 · Zasláno: 15. 7. 2015, 00:35:37
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 |
#3 · Zasláno: 15. 7. 2015, 00:38:22
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 |
#5 · Zasláno: 15. 7. 2015, 00:45:11
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 |
#8 · Zasláno: 15. 7. 2015, 12:54:31
Keeehi:
Vynikajúce riešenie, ďakujem za návrh. Teraz to funguje lepšie. |
||
Časová prodleva: 10 let
|
0