我们来做一个不可破解的验证码

如果你因为网站数据一直被爬,如果你因为活动一直被刷,如果你的短信通道被当成人肉炸弹,如果你的论坛被机器人野蛮刷帖,如果你的账户系统一直被暴力破解,如果你用了各种验证码包括极验也根本没用,你可以来这里了解一下 https://yuan.shuidi.cn

我们先来分析一下市面上的验证码

1、明显漏洞验证码

 

有明显漏洞的验证码 一般是根本就不明白验证码是用来干什么的程序员设计出来,可能是产品设计上有个验证码,好,那我实现一个,或者是外包公司实现功能即可,根本不管客户死活

下面是一个案例

给用户一个数学运算,然后求结果, 结果这个数学运算,用字符的形式输出到页面上,而不是保存成一张图片,这种验证码,形同虚设

 

2、数字,字母,中文验证码

 

这种验证码从互联网出现就存在了,数字,字母,中文,干扰线,噪点,旋转,扭曲,重叠,各种手段,但是还是无法去除特征太明显,组合结果太少的情况,用深度学习等ai手段很容易识别,市面上的一些orc的接口也能简单识别

所以这种验证码 在2019年的今天已经很无力了,如果你做过投票活动,你就会知道,刷票公司破解你的验证码是有多容易

 

 

3、极验验证码

极验验证码,号称行为识别,其实没那么高端,如果抛开复杂的js混淆逻辑,其实很简单,写个算法破解图片上的滑块缺口位置很容易(一个二值化就ok),复杂的只是极验的js混淆加密流程,但是客户端代码就是客户端代码,它是百分百可以破解的,只要你有足够的耐心,慢慢调试,总能找到最后的逻辑,所以极验的验证码并不是那么牢靠,市面上第三方破解极验的服务一大堆也很便宜,后续我会写一篇破解极验的文章

 

 

我们如何来设计一个几乎无法破解的验证码呢?

它只要满足一个要求,验证码的结果,用机器很难,或者要花费很长时间,花费很多代价才可以识别出结果

那些复杂的js混淆,各种花里胡哨的写法根本就没有任何作用

 

下面我们来介绍我们将要设计验证码的核心思路

 

将一张图旋转到一个随机的角度,然后让用户去识别图片的正确方向

 

 

人类通过自己的经验用不到1s的时间就可以识别出这张图的方向

 

但是利用目前的机器学习模型,如果要做到图片方向的识别还非常困难

当然有的同学说了,这个图就360张可能,我人工把这张图摆正,然后再生成360张旋转图,一张一张对比即可,把图片md5存到数据库,再加个索引,不要太简单

你说的很对,如果就这么一张图,你确实可以这么做,

解决这个难题很简单

生成的图片我们给一个10*10的随机偏移量,这样,一张图片,我们可以生成 10*10*360张图,然后我们在图片里随机的加空白点,这样,就无法md5做成索引查找了,比对只能遍历

然后我们再通过网络爬虫爬取那些没有版权的图片,让图片有上万张,你还可以一张一张的用人工摆正来识别码?

10000 * 10 * 10 *360

有的同学说可以,我有的时间

好,假设我我有一万张图,我一个小时放10张图出来,每个小时的图都不一样,你可以和我耗40多天吗?

我有10万张图呢?

 

是不是很刺激,想想那些spider们,刷票公司看着我们的验证码,望洋兴叹是不是很刺激 ,哈哈哈哈哈

那就赶紧行动起来吧

 

放一下生成旋转图的 php 代码,你可以将随机出来的角度 存到session里,或者memcache里,就ok啦,记得每次校验完,要把值清空噢,不管正确与否,

 

        $origin_width = 200;
        $origin_height = 200;

        //取一张图 $img_path 是一张210*210的jpg图片
        $origin_img = imagecreatefromjpeg($img_path);


        //重新画
        $src_img = imagecreatetruecolor($origin_width,$origin_height);
        $alpha = imagecolorallocatealpha($src_img, 0, 0, 0, 127);
        imagefill($src_img, 0, 0, $alpha);
        $src_x = rand(0,9);
        $src_y = rand(0,9);
        imagecopyresampled($src_img,$origin_img,0,0,$src_x,$src_y,$origin_width,$origin_width,$origin_width,$origin_width);

        $angle = rand(30,330);

        $src_img = imagerotate($src_img,-1*$angle,0);
        $w = imagesx($src_img);
        $h = imagesy($src_img);

        $r = $origin_width/2-4;//防止边缘问题,稍微取小一点
        $real_r = $w/2;

        //生成一张图
        $img = imagecreatetruecolor($origin_width-8, $origin_height-8);//防止边缘问题,稍微画小一点
        imagesavealpha($img, true);
        $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
        imagefill($img, 0, 0, $bg);

        for ($x = 0; $x < $w; $x++) {
            for ($y = 0; $y < $h; $y++) {
                $rgbColor = imagecolorat($src_img, $x, $y);
                if (((($x - $real_r) * ($x - $real_r) + ($y - $real_r) * ($y - $real_r)) < ($r * $r))) {
                    imagesetpixel($img, $x-($real_r-$r), $y-($real_r-$r), $rgbColor);
                }
            }
        }
        imagepng($img);
        //销毁图片
        imagedestroy($img);

放一个我们已经上线的案例

 

 

云版本已上线,目前免费使用  https://yuan.shuidi.cn

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章