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