php漢字の検証コードと数式の検証コードを実現する方法


本論文の例は、phpが漢字の検証コードと数式の検証コードを実現する方法を述べている。皆さんの参考にしてください。具体的な分析は以下の通りです。
簡単な数字やアルファベットの検証コードは簡単に解読されることが分かりますが、数式の検証コードや中国語の漢字の検証コードは簡単に解読されません。
検証コードを使う時は、できるだけ数式の検証コードや中国語の漢字の検証コードを使うことをお勧めします。
以下は私が書いた二つの検証コードです。有用な友達は参考にしてください。
1.数式の検証コード:

session_start();
header("Content-type: image/png");
$num1 = mt_rand(0,9);//
$num2 = mt_rand(1,9);//
$type_str = "+-*";//
$type = substr($type_str,rand(0,2),1);//
$change = mt_rand(1,3);
if($change==1){
 $code = "$num1$type$num2=?";
 $result = "\$verifyCode=$num1$type$num2;";
 eval($result);
 $_SESSION['authnum_session'] = $verifyCode; 
}elseif($change==2){
 $result = "\$verifyCode=$num1$type$num2;";
 eval($result);
    $code = $num1.$type."_=".$verifyCode;
 $_SESSION['authnum_session'] = $num2; 
}elseif($change==3){
 $result = "\$verifyCode=$num1$type$num2;";
 eval($result);
    $code = "_".$type.$num2."=".$verifyCode;
 $_SESSION['authnum_session'] = $num1; 
}
$im = imagecreate(68,28);  
$black = imagecolorallocate($im, 0,0,0);    
$white = imagecolorallocate($im, 255,255,255);
$gray = imagecolorallocate($im, 200,200,200);
$red = imagecolorallocate($im, 255, 0, 0);
imagefill($im,0,0,$white);       
imagestring($im, 5, 10, 8, $code, $black);   
for($i=0;$i<70;$i++) {
 imagesetpixel($im, mt_rand(0, 58) , mt_rand(0, 28) , $black);
 imagesetpixel($im, mt_rand(0, 58) , mt_rand(0, 28) , $red);
 imagesetpixel($im, mt_rand(0, 58) , mt_rand(0, 28) , $gray);
}
imagepng($im);
imagedestroy($im);
?>
2.中国語漢字の検証コード:

<?php
session_start();
$ch_str=" ";
$len = mb_strlen($ch_str,"utf-8");//
$str = array();
for($i=0;$i<4;$i++){
   $pos = mt_rand(0,$len-5);//
   $str[] = mb_substr($ch_str,$pos,1,"utf-8");
}
$authnum_session = implode("",$str);
$_SESSION['authnum_session'] = $authnum_session;   // session
Header("Content-type: image/PNG");
//
$image_x=100;
$image_y=50;
$im = imagecreate($image_x,$image_y);
//
$bkg = ImageColorAllocate($im,255,255,255);
// , , window 。
$fnt = "simhei.ttf";
//
$white=ImageColorAllocate($im,234,185,95);
// ,
imagearc($im, 150, 8, 20, 20, 75, 170, $white);
imagearc($im, 180, 7,50, 30, 75, 175, $white);
// ,
imageline($im,20,20,180,30,$white);
imageline($im,20,18,170,50,$white);
imageline($im,25,50,80,50,$white);
//
$noise_num=3000;
$line_num=50;
//
$rectangle_color=imagecolorallocate($im,0xAA,0xAA,0xAA);
$noise_color=imagecolorallocate($im,0x00,0x00,0x00);
$font_color=imagecolorallocate($im,0x00,0x00,0x00);
for($i=0;$i<$noise_num;$i++)
{
    // , , 。
    //imagesetpixel($im,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color);
}
for($i=0;$i<$line_num;$i++)
{
    $line_color=imagecolorallocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
    // ,
    imageline($im,mt_rand(0,$image_x),mt_rand(0,$image_y),mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color);   
}

for ($i=0;$i<4;$i++)
{
    ImageTTFText($im, rand(18,20), rand(0,20), rand(($image_x/4)*$i+$image_x/100,($image_x/4)*$i+$image_x/8), rand($image_y/2+$image_y/10,$image_y/2+$image_y/5), $font_color, $fnt, $str[$i]); 
 
}
ImagePNG($im);
ImageDestroy($im);
?>

フォントファイル:simhei.rarはここをクリックしてダウンロードです。
注意:
中国語の漢字認証コードは単独で実行して、sessionを取得すると、認証コードとsession内容が一致しないことが分かります。ただし、この中国語漢字検証コードファイルをSrc属性で引用し、sessionを取得すると、両者の内容は一致します。
興味のある友達はこれをさらに改善することができます。
本論文で述べたように、皆さんのphpプログラムの設計に役に立ちます。