欢迎访问Sunbet,Sunbet是欧博Allbet的官方网站!

首页Sunbet_新闻事件正文

中文点选验证码之自动识别_Sunbet 申博

de64384a174e12dc2018-09-126Web安全TASS008

某次测试中碰到了汉字点选的验证码,看着很简朴,尝试了一下发明有两种简朴的辨认要领,终究有空给重新整理一下,分享出来。 

0×01  验证码的猎取

起首猎取验证码。因为网站对照特别,就不以他们的为例,本身天生验证码吧。这个不是重点,这里间接贴代码了。

<?php
function createImage($word    ,$imagePath,$type    , $imageName){
   $fontPath = 'msyh.ttc'    ;//字体
   $fontSize = 20     * 0.75;
   foreach ($word     as $v ) {
        $fontarea  =     imagettfbbox($fontSize,     0 , $fontPath, $v        );
        $textWidth =     $fontarea[2] -     $fontarea [0];
        $textHeight =     $fontarea[1] -     $fontarea [7];
        $tmp[    'text'] = $v;
        $tmp[    'size'] = $fontSize;
        $tmp[    'width'] = $textWidth;
        $tmp[    'height'] = $textHeight;
        $textArr[] =     $tmp;
   }
   list( $imageWidth    , $imageHeight,  $imageType) =         getimagesize( $imagePath);
   for( $i    =0;$i <        count($textArr );$i            ++){
        list(    $x, $y) =  randPosition        ($textArr,  $imageWidth,             $imageHeight, $textArr[$i                ][ 'width'], $textArr[                    $i]['height'],                    $i,$type);
        $textArr[    $i]['x'] =     $x;
        $textArr[    $i]['y'] =     $y;
   }
   unset( $v    );
   //建立图片的实例
   $image =  imagecreatefromstring    (file_get_contents( $imagePath));
   //字体色彩
   $color =  imagecolorallocate    ($image,  0,         0,  0);
   //绘画笔墨    
   foreach( $textArr     as $v){
        imagefttext (    $image, $v ['size'        ], 0 , $v[            'x' ], $v['y'                ], $color,  $fontPath                ,$v ['text']);
   }    
   if (imagepng    ( $image,$imageName )){
        echo $imageName    ." \n";
   }
}
functionrandPosition ($textArr    ,  $imgW, $imgH ,         $fontW,  $fontH,$i            ,$type){
    switch  ($type    ) {
        case 0    :// 天生mp
             $x =     rand ($i* 60        , ($i +1)*            60-$fontW -            3);    
             $y =     rand (40, 80        );    
             break;
         case1    : //天生ap
             $x = (    $i )*25+ 5        ;
             $y =     25;    
         default:
             break;
    }
    $return =  array    ( $x,  $y);
    return$return ;
}
$ap_imagePath  =  'ap_bg.png' ;
$mp_imagePath  =  'mp_bg.png' ;
$ap_imageName  =  "ap_" .    time (). ".png" ;    
$mp_imageName  =  "mp_" .    time (). ".png" ;    
$ap_word  =  array (    ' 请 ' ,    ' 依 ' ,    ' 次 ' ,    ' 点 ' ,    ' 击 ' ,    ' 图 ' ,    ' 中 ' ,    ' 的 ' ,    ' 猎 ' ,     ' 户 ' ,    ' 室 ' )                                                                                                                                                                                                                                                                                                                                                                                                                                                ;
$mp_word  =  array (    ' 猎 ' ,     ' 户 ' ,     ' 实 ' ,    ' 验 ' ,    ' 室 ' );
createImage ( $ap_word ,    $ap_imagePath , 1 ,    $ap_imageName );
createImage ( $mp_word ,    $mp_imagePath , 0 ,    $mp_imageName );
?>

运转后天生如许两张图片。

ap_XXXXX.png

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第1张mp_XXXXX.png

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第1张mp_XXXXX.png

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第3张ap_XXXXX.png是申明须要点击的笔墨,mp_XXXXX.png是须要点击的图片。

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第3张ap_XXXXX.png是申明须要点击的笔墨,mp_XXXXX.png是须要点击的图片。

0×02  验证码辨认

关于这类简朴的点选验证码,能够有两种很轻易的辨认体式格局(机械进修算贫苦的,这里就不列出了。嗯,对,我也不会)。一种是opencv的图象模板婚配,别的一种是OCR辨认。

1. opencv的图象模板婚配

第一种体式格局,运用opencv的图象模板婚配。模板婚配是一种在较大图象中搜刮和查找模板图象地位的要领,opencv2和opencv3中供应了一个特地用于模板婚配的函数matchTemplate()。它是在输出图象上滑动模板图象(如在2D卷积中),并对照模板图象下的输出图象的模板和补钉。在OpenCV中完成了六种对照要领(这里用到的是cv2.TM_CCOEFF_NORMED),它前往一个灰度图象,个中每一个像素透露表现该像素的邻域与模板婚配的水平。

取得效果后,能够运用cv.minMaxLoc()函数查找最大/最小值的地位。将其作为矩形的左上角,并将(w,h)作为矩形的宽度和高度,谁人矩形就是模板地区。

我们停止运用模板婚配来辨认这类验证码时,起首先将“模板”找出来,这里我们须要婚配的是“猎”、“户”、“室”这三个字。将这三个字地点的图片停止截取,然后运用matchTemplate()函数在mp中停止婚配。

起首截取第一个字“猎”。

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第5张

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第5张

截取以后,就能够在mp中停止婚配。

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第7张这里得到了最大和最小地位。我们运用最大地位,然后将最大值作为阈值。猎取模板的尺寸,然后在 mp    顶用矩形(赤色地区)画出婚配的地区。以下所示。                                                                                                                                                                                                                                

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第7张这里得到了最大和最小地位。我们运用最大地位,然后将最大值作为阈值。猎取模板的尺寸,然后在 mp    顶用矩形(赤色地区)画出婚配的地区。以下所示。                                                                                                                                                                                                                                

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第9张同理,用黄色和蓝色矩形将“户”、“室”地点的地区画出来。

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第9张同理,用黄色和蓝色矩形将“户”、“室”地点的地区画出来。

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第11张

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第11张

点选时发送所选地区中央的坐标便可,这里就不再给出实例了。这类要领固然简朴,然则关于字体纷歧的就不能很准确的符号出来。

修正天生图片的代码,将mp中的笔墨的字体设置为随机。修正的代码以下:

   switch($type) {

case0: //mp笔墨随机巨细

$fontSize=rand (20,30) *0.75 ;

,

申博区块链导航【www.xnb999.com】

国内最全面的区块链数字货币导航网站--申博区块链官网!

,

break;

case1 ://ap笔墨流动

$fontSize=20 *0.75;

break;

   }

ap天生的效果照样和之前一样, mp 的图片以下:                                                                                                                                 

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第13张运用异样的代码来婚配。                                                                                                                                                                         

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第13张运用异样的代码来婚配。                                                                                                                                                                         

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第15张此时婚配的效果就有些惨绝人寰了。以是就换别的一种辨认体式格局-ocr 辨认。     

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第15张此时婚配的效果就有些惨绝人寰了。以是就换别的一种辨认体式格局-ocr 辨认。     

2.OCR辨认

这里接纳的是腾讯云的OCR-通用印刷体辨认(https://cloud.tencent.com/document/product/866/17600)。

参考文档。输出mp图片,前往的是json。

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第17张检察json内容,发明包含了图片中的笔墨、地位和巨细等。

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第17张检察json内容,发明包含了图片中的笔墨、地位和巨细等。

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第19张同理ap中内容也能够猎取。    

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第19张同理ap中内容也能够猎取。    

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第21张

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第21张

此时婚配的时刻间接就是婚配笔墨了。起首猎取ap中后三个笔墨,然后与mp中前往的内容婚配,猎取其地位和巨细,然后再画矩形便可。

因为对照简朴,这里间接贴效果。

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第23张婚配相称圆满。 

中文点选验证码之自动识别_Sunbet 申博  Web安全 TASS008 第23张婚配相称圆满。 

0X03 总结

本文用了两种要领来自动辨认汉字点选验证码,第一种接纳的是opencv的模板婚配,这类要领固然也能够婚配到,但这类要领瑕玷就是关于字体外形差别较大的验证码辨认率较低。而第二种要领就对照快速方便了,并且辨认度高,对照引荐第二种要领。

固然这两种要领关于简朴、“正轨”的验证码能够,碰到庞杂的、“歪曲的”验证码就不行了。这时刻就要用到机械进修了,而本文只是简朴的“辨认”,将机械进修用到这里,就有些牛鼎烹鸡了。

相干代码:https://github.com/fupinglee/MyPython/tree/master/captcha/Pointselection

0×04 参考

[1]http://bluewhale.cc/2017-09-22/use-python-opencv-for-image-template-matching-match-template.html

[2]https://cloud.tencent.com/document/product/866/17600

*本文作者:江南天安猎户攻防实验室,转载请说明来自FreeBuf.COM

,

申博美图网【www.fc383838.com】

最养眼的美女图片网站_两性话题 _两性私密。

网友评论