Heim >php教程 >php手册 >谈谈那些年PHP中屌屌的验证码,PHP屌屌验证码

谈谈那些年PHP中屌屌的验证码,PHP屌屌验证码

WBOY
WBOYOriginal
2016-06-13 09:22:171623Durchsuche

谈谈那些年PHP中屌屌的验证码,PHP屌屌验证码

  验证码已经是现在网站中非常基础的知识点了,验证码的存在可以防止恶意破解密码、刷票、灌水,可以有效的防止暴力破解特定用户。

  现在就来了解了解那些年PHP中屌屌的验证码吧。

  首先,以四位验证码为例(多位验证码一样的道理)。

  目前网站大多仍然采用静态图片验证码,因为这样实现起来简单又方便,不需要过硬的功底,当然这也是基础。而其原理也就是通过PHP的画图功能将文字画成图片返回到页面。因此,我们解决的问题也就只有三步而已:

  当然,PHP默认是没有开启绘图功能的,因此,在php.ini的配置文件中先开启绘图功能吧:搜到  ;extension=php_gd2.dll  将前面的分号去掉即可。(记得保存喔!)

  那根据第一点,大家首先应该会想到数字的验证码,因为这容易,随机生成个几个数字,然后拼起来也就行了,像酱紫!

1 $validateCode = ''; 2 for ($i = 0; $i $i ++) { 3 $validateCode .= rand(0, 9); 4 } 5 echo $validateCode; View Code

  然后仔细想想,现在的网站验证码都有字母,可这玩意儿都没字母,怎么呢?然后又想到,直接把上面那玩意儿搞成十六进制就好了。

1 $validateCode = ''; 2 for ($i = 0; $i $i ++) { 3 $validateCode .= dechex(rand(0, 16)); 4 } 5 echo $validateCode; View Code

  好像有点自作聪明的赶脚呀,不过想想,也算是有几个字母了,可却只有a,b,c,d,e,f,那要是需要所有字母咋办呢?哈哈,在想想也就想到把所有的字母和数字等在一个字符串中列出来,然后通过随机下标的形式去
随机获取对应的值,也就成了这样:

1 $validateCode = ''; 2 $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'; 3 for ($i = 0; $i $i ++) { 4 $validateCode .= $str[rand(0, strlen($str))]; 5 } 6 echo $validateCode; View Code

  哈哈,终于像验证码里的随机数了,不过看到下面的方法,有总瞬间被秒的赶脚呀:

<span>echo</span> <span>substr</span>(<span>str_shuffle</span>('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);

  str_shuffle方法将字符串内容打乱,substr($str, 0, 4)取到了前四个数。这样是完全没有问题的!不过细心的看的出来,这样的验证码里的内容是不会重复的。

 

  以上验证码也就产生了,接下来也就要将验证码用PHP画出来了。

1 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4); 2 3 // 创建一张宽为110px,高为25px的图片 4 $img = imagecreatetruecolor(110, 25); 5 // 将图片的背景颜色设置成黑色,颜色值分别对应RGB 6 $bgcolor = imagecolorallocate($img, 0, 0, 0); 7 8 // 创建白色 9 $white = imagecolorallocate($img, 255, 255, 255); 10 11 // 添加文字在图片中,第二个参数为文字的大小,只能在1~5,第三个参数为x坐标,第4个参数为y坐标,第5个参数为文字的内容,第6个参数为文字的颜色 12 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white); 13 14 // 添加文字在图片中,第二个参数为文字的大小,只能在1~5,第三个参数为x坐标,第4个参数为y坐标,第5个参数为文字的内容,第6个参数为文字的颜色 15 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white); View Code

  

  当然,这样的话验证码就太好识别了,就只是单纯的黑底白字,为了增加点难度,我们就多加几条线叠加在验证码的上面。

1 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4); 2 3 // 创建一张宽为110px,高为25px的图片 4 $img = imagecreatetruecolor(110, 25); 5 // 将图片的背景颜色设置成黑色,颜色值分别对应RGB 6 $bgcolor = imagecolorallocate($img, 0, 0, 0); 7 // imagefill($img, 10, 10, $bgcolor); 8 9 // 创建白色 10 $white = imagecolorallocate($img, 255, 255, 255); 11 12 for ($i = 0; $i $i ++) { 13 // 在图片上画线,其中第2个参数表示线的x起始坐标,第3个参数表示线的y起始坐标,第4个参数表示x的终止坐标,第5个参数表示y的终止坐标,第6个参数表示颜色,此处生成一个随机颜色 14 imageline($img, rand(0, 110), rand(0, 50), rand(0, 110), rand(0, 50), imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255))); 15 } 16 17 // 添加文字在图片中,第二个参数为文字的大小,只能在1~5,第三个参数为x坐标,第4个参数为y坐标,第5个参数为文字的内容,第6个参数为文字的颜色 18 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white); 19 20 // 返回成图片 21 header('Content-type: image/png'); 22 imagepng($img); View Code

  结果也就成了这样,当然,要想实现验证码,这样还是不够滴,需要通过将验证码生成的随机数存到服务器的session中,$_SESSION['validate'] = $validateCode;然后在通过客户端输入的验证码与之对比即可。PHP中屌屌的验证码也就这样实现了,当然,前面也说过了,这是最基础的代码,可以通过你的想法将其改变为实现算术的验证码,中文的验证码,或其它一些有趣的验证码,以减少其枯燥性又实现安全性。

 

  大家有没有什么其它屌屌的验证码分享与我呢?

 

对于PHP中验证码的问题

那是因为,php.ini 中的register_global = off;
修改成on就可以了,不过在php5后默认是将其设置为off,
因为直接获值并不安全,想想如果用户知道你的session的名字
那他是不是可以通过get,或post方法修改你的session呢?
因为获值是只要名字就行了!
php5一般使用超全局变量!
$_GET
$_POST
$_COOKIE
$_SESSION

另楼主的书好像有点老了,session_register在php5中已经不推荐使用了,现在可以直接赋值了$_SESSION['yzm'] = 100;

注:听说php6已出来了!
 

php中生成图片验证码问题

找到原因了:$rand变量没有初始化,直接输出时会有警告。解决办法是在for语句之前加上$rand='';这样就没问题了。
session_start();
$rand='';
for($i=0;$i $rand.=dechex(rand(0,15));
}
$_SISSION['rand']=$rand;

$bg=imagecreatetruecolor(100,30);
$im=imagecolorallocate($bg,0,0,0);
$color=imagecolorallocate($bg,255,255,255);
imagestring($bg,5,0,0,$rand,$color);

header("Content-type: image/jpeg");
imagejpeg($bg);
 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn