设为首页 收藏本站
查看: 822|回复: 0

[经验分享] 比较全面的php session验证码与防识别

[复制链接]

尚未签到

发表于 2017-4-10 11:29:56 | 显示全部楼层 |阅读模式
  验证码开发过程中的 3 个误区:
  1、    背景干扰:干扰线、干扰点、干扰图,基本没有,程序很容易通过高亮度调节去除掉。
  2、    字符旋转:破解机器人通过数次学习、旋转之后,能够得到 90% 以上的正确识别率,采用常规字体,能够得到接近 100% 的识别。
  3、    随机间距:基本没用,采用提取高亮度之后,采用图片切割的方法,很容易就将随机间距消灭掉。
   
  防止被破解:
  1、    背景干扰线尽量能够干扰到字符,采用和字符相同的颜色,能够破坏高亮度反差色提取法对字符的学习。 QQ 有采用。
  2、    矢量变形:想 GoogleMsYahoo 都采用了这种变态的方法,这种将字符进行扭曲变形,基本上机器识别率为零,因为没有相对应的固定形状。 损失是用户也不一定认得。需要验证码图片有一些大才行。
  3、    字符粘连,可以破坏掉字符切割法分割字符, Google 也有用到这个, QQ 也有采用。
  4、    中文验证码,中文验证码的识别难度比较大,但是现在逐渐的也慢慢被学习并且破解。(香港,台湾是用繁体)
  5、    字符旋转:需要和字符粘连在一起才能够起作用,他们一起,验证码几乎不具备机器破解可能性。 加随机背景图片、随机字体、稍微旋转字母或数字,位置不固定,稍微扭曲

  注意:下载空心字体
  字体.ttf的当$mode=7的该字体必须支持中文,否则出现乱码。
  在服务端做验证时取session存储的验证字符与用户提交的字符进行比较,相同则通过验证。

<?php
/*
* @Date 2011-2-24
* @Author hudeyong926
*/
function random($type, $length = 16) {
$rulemap_str = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
$rulemap_num = "123456789";
$string = '';
for ($i = 0; $i < $length; $i++) {
switch ($type) {
case 'ENGLISH':
$rand = mt_rand(0, (strlen($rulemap_str) - 1));
$string .= $rulemap_str[$rand];
break;
case 'CHINESE':
$str[$i] = chr(mt_rand(176, 215)) . chr(mt_rand(161, 249));
$str[$i] = iconv("GB2312", "UTF-8", $str[$i]); //imagettftext是utf-8的,所以先转换下
$string .= $str[$i];
break;
case 'NUM':
$rand = mt_rand(0, (strlen($rulemap_num) - 1));
$string .= $rulemap_num[$rand];
break;
case 'FULL':
$fullstr = $rulemap_str . $rulemap_num;
$rand = mt_rand(0, (strlen($fullstr) - 1));
$string .= $fullstr[$rand];
break;
}
}
return $string;
}
//建立验证图片
function createAuthNumImg($randStr, $fontName, $imgW = 100, $imgH = 40) {
header ( "content-type: image/png" );
$image = imagecreate ( $imgW, $imgH );
$fontSize = 20;//字号
//$green = imagecolorallocate($image,0x6b,0xc1,0x46);
$gray = imagecolorallocate ( $image, 228, 228, 228 ); //灰色
$red  = imagecolorallocate ( $image, 255, 102, 204 );//粉色
$blue = imagecolorallocate($image,0x53,0x68,0xbd);
$colors = array($red, $gray, $blue);
$color_b = imagecolorallocate ( $image, 0, 0, 0 ); //黑色
for($i = 0; $i < 1000; $i ++) { //绘背景干扰点
imagesetpixel ( $image, mt_rand ( 0, $imgW ), mt_rand ( 0, $imgH ), $colors[rand(0,count($colors)-1)]);
}
imagerectangle ( $image, 0, 0, $imgW - 1, $imgH - 1, $color_b );//绘制边框
imagettftext ( $image, $fontSize, 5, 3, 25, $color_b, $fontName, $randStr);///将验证字符绘入图片 字符旋转
for($i=0; $i<2; $i++){ //绘背景干扰线
imageline($image, mt_rand(0,5), mt_rand(6,18), mt_rand(65,$imgW), mt_rand(6,$imgH), $color_b);//一条干扰线
}
imagepng ( $image );
imagedestroy ( $image );
}
session_start ();
$verifyCode = random('english', 5);
$_SESSION ['VERIFY_CODE'] = $verifyCode ;
createAuthNumImg ( $verifyCode, "font.ttf", 75, 30); //字体存放路径,如果你没有文件就去C:\WINDOWS\Fonts文件中找一个吧。
/** 问答模式
$a=GetCode(2,1);  
$b=GetCode(1,1);  
$passPort = $a."+".$b."=?";  
$verifyCode = $a+$b;  
$_SESSION ['VERIFY_CODE'] = $verifyCode ;  
createAuthNumImg ( $passPort, "font.ttf", 75, 30);
*/
?>
  中文占两个字符长度,需要控制验证码图片的长度,一个中文位置相当于2个非中文

<?php echo strlen('中'); echo strlen('ad');?>
  为了避免机器人的破解,验证码的视觉效果越来越差,随之很多网站就加了“看不清?请刷新”之类的功能,当然也不是简简单单的页面刷新,是只刷新验证码部分,用户从而得到一个新的验证码。在网上看了些别人写的方法,下面总结两种。
第一种比较简单,运用一下onclick即可,直接点击验证码的图片就可以刷新,不过最好在验证码后面说明一下,提示有这个功能。

<img src="validimg.jsp" alt="看不清?请刷新" width="50" height="20"  />
  第二种则是用JavaScript的方法:

<img src="validimg.jsp" width="50" height="20" > <a href="JavaScript:reloadImage("validimg.jsp" );">刷新</a>
<script language="JavaScript">
function reloadImage(url){
document.formName.img1.src = url+Math.random();
}
</script>




 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362872-1-1.html 上篇帖子: cas sso 集成 java + php (discuz,bbs) 配置 下篇帖子: js,jquery,php 对小数点的处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表