2011-06-26 10 views
0

私は単純なcaptchaをhmlフォームに追加しようとしています。コードは、もともとここhereこのPHPスクリプトで何が問題なのですか? (キャプチャ)

から画像を生成し、キャプチャ変数を格納するPHPスクリプトです。ここ

<?php 

session_start(); 

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 

header("Cache-Control: no-store, no-cache, must-revalidate"); 

header("Cache-Control: post-check=0, pre-check=0", false); 

header("Pragma: no-cache"); 



function _generateRandom($length=6) 

{ 

    $_rand_src = array(

     array(48,57) //digits 

     , array(97,122) //lowercase chars 

//  , array(65,90) //uppercase chars 

    ); 

    srand ((double) microtime() * 1000000); 

    $random_string = ""; 

    for($i=0;$i<$length;$i++){ 

     $i1=rand(0,sizeof($_rand_src)-1); 

     $random_string .= chr(rand($_rand_src[$i1][0],$_rand_src[$i1][1])); 

    } 

    return $random_string; 

} 



$im = @imagecreatefromjpeg("captcha.jpg"); 

$rand = _generateRandom(3); 

$_SESSION['captcha'] = $rand; 

ImageString($im, 5, 2, 2, $rand[0]." ".$rand[1]." ".$rand[2]." ", ImageColorAllocate ($im, 0, 0, 0)); 

$rand = _generateRandom(3); 

ImageString($im, 5, 2, 2, " ".$rand[0]." ".$rand[1]." ".$rand[2], ImageColorAllocate ($im, 255, 0, 0)); 

Header ('Content-type: image/jpeg'); 

imagejpeg($im,NULL,100); 

ImageDestroy($im); 

?> 

は、入力されたキャプチャを検証するスクリプトです:

<?php 

if($_SESSION["captcha"]==$_POST["captcha"]) 

{ 

    //CAPTHCA is valid; proceed the message: save to database, send by e-mail ... 

    echo 'CAPTHCA is valid; proceed the message'; 

} 

else 

{ 

    echo 'CAPTHCA is not valid; ignore submission'; 

} 

?> 

問題がありますセッションには3文字しか格納されていないように見えるので、値は決して一致しません。生成されるイメージは6文字です。

上記のコードは少し奇妙です(私はイメージライブラリAPIを使用していないことを認めなければなりません)。しかし、なぜ私たちが3のarg値で_generateRandom()を呼び出すのかわからなくて、なぜimagestringが2回呼び出されているのですか?

+0

すぐにスキップすると、 '_generateRandom();'を一度使用する必要があります。すでに標準の引数であるため、長さを6にしたい場合は引数を指定しないでください。あなたは二重関数呼び出しの束をしているようです。 – Alfred

+0

私は問題を発見したかもしれないと思います。格納されている値が正しくありません。イメージに表示される値は、generateRandom()から返されたcharsの組み合わせです。この結合された値は、セッション変数に格納する必要があります。私は文字列のいくつかのランダムな選択があるかどうかを調べるためにさらに調査中です... – oompahloompah

+0

なぜ代替空白行がありますか? –

答えて

2

表示CAPTCHA入力並んで次のテキスト:

「3つの黒色シンボル(赤のものを無視する)を入力」のみ黒文字がセッションに格納されているので、D

を。

更新:あなたが入力したリンクを確認しました。入力欄の上に「 」(スパム対策コード、3黒記号)のテキストがあります。

+0

これは本当にクールです。よく目撃された。 Hehe、私は完全にそれを逃した;)私はあなたのソリューションを選択する必要があります! – oompahloompah

1

あなたは

$rand = _generateRandom(3); 

$_SESSION['captcha'] = $rand; 

でそれを初期化し、

ImageString($im, 5, 2, 2, $rand[0]." ".$rand[1]." ".$rand[2]." ", ImageColorAllocate ($im, 0, 0, 0)); 

$rand = _generateRandom(3); 

ImageString($im, 5, 2, 2, " ".$rand[0]." ".$rand[1]." ".$rand[2], ImageColorAllocate ($im, 255, 0, 0)); 

から画像を生成した後、第2の$ランドは$_SESSIONに格納されていないされています。あなたは「のみ黒色の数字」機能を使用しない場合

1

、ちょうどImageStringの2回目の呼び出し後

$_SESSION['captcha'] .= $rand; 

を追加します。

インターネットのオフ「リフティング」のコードで手抜きをしようとする私に教えてくれます:ここで

1

は、溶液(!元のコードがf00kedた)だP

そのコードの一部キャプチャは次のように書き直す必要があります:

<?php 
$rand1 = _generateRandom(3); 

imagestring($im, 5, 2, 2, $rand1[0]." ".$rand1[1]." ".$rand1[2]." ", imagecolorallocate($im, 0, 0, 0)); 

$rand2 = _generateRandom(3); 
imagestring($im, 5, 2, 2, " ".$rand2[0]." ".$rand2[1]." ".$rand2[2], imagecolorallocate($im, 255, 0, 0)); 
imagejpeg($im,null,100); 

$value_to_store = $rand1[0].$rand2[0].$rand1[1].$rand2[1].$rand1[2].$rand2[2]; 

?> 
関連する問題