关于php验证码的破解。

ci1699 2012-02-09 11:21:46
网站防爆最好是加验证码了。
市场上的验证码一般有几花样,
英文+数字、中文与JS的,
还有很少见的中国移动识图验证码。
这种看似很威武,实际上感觉也不太好,答案就固定有8个了。
做数字是否存在判断后,答案就能锁定4个了。靠蒙的话,蒙对的机率还是挺大的。

最后是加些干扰点、干扰线。再扭曲字体等。

php通常是用GD库生成图片+SESSION来实现认证,
当突破验证码这关之后,可以模拟请求获sessionID,
用获得sessionID取得验证码分析之后再模拟注册登录验证。

验证码被破后基本是畅通无阻了。然后就爆力效验账号密码,滥发信息之类云云了……

在明白过程后就好防备了,所以说涉及到几个问题。
一、要加强验证码难度,一些位置固定字符形态不变的是很容易识别的了。
二、要SESSION做适当配置。SESSION效验后及时清掉,禁止URL传值设置等...
三、适当做些时间与次数限制。

下面是百度的验证码BZ6E,应该有来路判断的提交几次就挂了,伪一下才行。
有些难度,每个字符都连接一起加干扰线加少许扭曲,跟淘宝的差不多,不过淘宝没干扰线。
大家讨论下看看怎么破,应该还是有人破的了。贴吧上还是经常有人爆吧的。 


好了,先扯这么多。


$image_name = 'baidu.jpg';
$image = "http://tieba.baidu.com/cgi-bin/genimg?0013286908280168B65F46CEDCD48CF9D46DF47A64587DA42FC48BF1CF8D47BD0D0BC2EE39911C9918D5CF46E79CF94FFA71BC0DC14DAE59197F42F24B4455C205062670A2977101F1A661F7F4716A8BC2C21D586F886CA300E0D42874D6365A1216622D9740163479D1DD416DAE5D70C09EA834F6B9EC307A29CDAF8D0C78FE159402800B113F6039195E5D683695532E4E2FFD8563D732AD19EDFB147B7569B617BDFBE487CE77AE49E75D83BA56B7038971E2081F647A&t=0.7108543934300542";


$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $image);
curl_setopt($curl, CURLOPT_REFERER, 'http://tieba.baidu.com/f?kw=baidu');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
file_put_contents($image_name, $result);


$size = getimagesize($image_name);
$im = imagecreatefromjpeg($image_name);
imagejpeg($im, 'baidu.jpg',100);
$width = $size[0];
$height = $size[1];


for($x = 1; $x < $width; $x ++)
{
for($y = 1; $y < $height; $y ++)
{
$color = imagecolorat($im, $x, $y);
$_col[$x][] = $color;
if($color < '16777215') $all_color[$color] = $color;
}
}

$n = array_sum($all_color) / count($all_color);

foreach ($_col as $key=>$val)
{
foreach ($val as $k=>$v)
$col[$key] .= $v < $n ? '1':' ';
}

// 去多余行列
foreach ($_col as $key=>$val)
if(array_sum($val) < 1) unset($col[$key]);


foreach ($col as $key=>$val)
{
$val = trim($val);
if(empty($val)) unset($col[$key]);
}

echo '<pre>';
print_r($col);


...全文
750 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
life169 2012-02-12
  • 打赏
  • 举报
回复
相对位置随机
字体随机
字形随机
形状扭曲
颜色随机

且字符之间有重叠部分。

别说是机器识别,就是肉眼识别都很难。
床上等您 2012-02-11
  • 打赏
  • 举报
回复
百度的验证码很好识别吧。。。
我公司一同事就写了个识别的,正确率90%以上
----

熊猫哥哥 2012-02-11
  • 打赏
  • 举报
回复
我人识别都经常看不准。
ci1699 2012-02-09
  • 打赏
  • 举报
回复


绕过验证码可能性几乎为0啊,主要是识别了。
前些时间还是有看到刷屏的啊,发些贴还是乱码的。
不知是识别了验证码还是另有其它原因。
helloyou0 2012-02-09
  • 打赏
  • 举报
回复
坦白的说,干这个基本是浪费时间.....

我现在一般都推荐用recaptcha,实际上很多大网站都在用,破破看?

还有,现在的另一个趋势是干脆不用验证,而是通过统计方法来识别垃圾,
比如
http://disqus.com/welcome/
黄袍披身 2012-02-09
  • 打赏
  • 举报
回复
啥意思 讨论如何破解百度的验证码?很久以前,我记得那个时候百度的验证码是可以根据某个特征逆出来的,后来给修复了。

你说经常有人爆吧,那是因为人肉ddos.当我发动1000个人一起攻击的时候,如果程序和硬件跟不上是完全无法阻挡的,所以单单从程序上来说绕过验证码我觉得可能性不大。别小看了百度的程序员。至于识别出验证码,那是老生常谈的问题了,识别关键是识别率,类似像淘宝这样的 当你的验证多少次输入失败后就直接封你ip多长时间,你的识别率要是不高的话,那就是浮云啊.
tottyandbaty 2012-02-09
  • 打赏
  • 举报
回复
好帖.不过看过那个中极验证破解的文章,不太理解哦...
ghj902260 2012-02-09
  • 打赏
  • 举报
回复
我一般用粘合 的方式 +字符变形 底纹细小的字母(就是增加噪点)
一般不被爆!~
黄袍披身 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ci1699 的回复:]

和谐社会 = =..,前几天就识了一系统的验证码,
一键登录注册登录发消息,纯练练手学习学习哈,没去干坏事。



引用 6 楼 xuzuning 的回复:
图像识别(OCR)是广泛的技术,算法巨多
目前OCR技术可谓炉火纯青了

不过若用于识别验证码,未免也太不道德了

和谐社会是需要大家来创建的
[/Quote]

求包养~ 求组队,求装备
ci1699 2012-02-09
  • 打赏
  • 举报
回复
和谐社会 = =..,前几天就识了一系统的验证码,
一键登录注册登录发消息,纯练练手学习学习哈,没去干坏事。



[Quote=引用 6 楼 xuzuning 的回复:]
图像识别(OCR)是广泛的技术,算法巨多
目前OCR技术可谓炉火纯青了

不过若用于识别验证码,未免也太不道德了

和谐社会是需要大家来创建的
[/Quote]
ci1699 2012-02-09
  • 打赏
  • 举报
回复
这个验证码就很容易识别了。很容易切割。

[Quote=引用 4 楼 amani11 的回复:]

二值化不好,通常在处理过程就会丢失一些精度,要求验证码变化比较简单的,还需用数据库去比对能搞出来

非OCR的方法,我觉得用数据模拟覆盖,达XX%以上就认为找出一个字,这么来可能更好一些。直接无视干扰

个人用这种方法,试过开源的部分程序,效果还可以,比率30%——90%以上都有


当然,开源的程序,用的字体、变形方式都是清楚的,,,非开源的只能靠自己发现啦,hoho~~~~~
……
[/Quote]
该昵称很风骚 2012-02-09
  • 打赏
  • 举报
回复
被爆过的路过
菜鸟的我还没找到一个终极的解决办法,想想还是用时间限制+ip&&次数来做点抵挡了
xiachao2008 2012-02-09
  • 打赏
  • 举报
回复
高手都来了所
xuzuning 2012-02-09
  • 打赏
  • 举报
回复
图像识别(OCR)是广泛的技术,算法巨多
目前OCR技术可谓炉火纯青了

不过若用于识别验证码,未免也太不道德了

和谐社会是需要大家来创建的
amani11 2012-02-09
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20120118/23/ee71c0b4-c2f1-4cb1-ae39-7fbac34b57df.html

前几天坛友的一个帖子,,二值化倒是很好用……hoho~~~~
amani11 2012-02-09
  • 打赏
  • 举报
回复
二值化不好,通常在处理过程就会丢失一些精度,要求验证码变化比较简单的,还需用数据库去比对能搞出来

非OCR的方法,我觉得用数据模拟覆盖,达XX%以上就认为找出一个字,这么来可能更好一些。直接无视干扰

个人用这种方法,试过开源的部分程序,效果还可以,比率30%——90%以上都有


当然,开源的程序,用的字体、变形方式都是清楚的,,,非开源的只能靠自己发现啦,hoho~~~~~

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧