谈谈那些年PHP中屌屌的验证码,PHP屌屌验证码
验证码已经是现在网站中非常基础的知识点了,验证码的存在可以防止恶意破解密码、刷票、灌水,可以有效的防止暴力破解特定用户。
现在就来了解了解那些年PHP中屌屌的验证码吧。
首先,以四位验证码为例(多位验证码一样的道理)。
目前网站大多仍然采用静态图片验证码,因为这样实现起来简单又方便,不需要过硬的功底,当然这也是基础。而其原理也就是通过PHP的画图功能将文字画成图片返回到页面。因此,我们解决的问题也就只有三步而已:
当然,PHP默认是没有开启绘图功能的,因此,在php.ini的配置文件中先开启绘图功能吧:搜到 ;extension=php_gd2.dll 将前面的分号去掉即可。(记得保存喔!)
那根据第一点,大家首先应该会想到数字的验证码,因为这容易,随机生成个几个数字,然后拼起来也就行了,像酱紫!
![](http://www.bkjia.com/uploads/allimg/141105/164R94437-0.gif)
1 $validateCode = ''
;
2 for (
$i = 0;
$i $i ++
) {
3 $validateCode .=
rand(0, 9
);
4 }
5 echo $validateCode;
View Code
然后仔细想想,现在的网站验证码都有字母,可这玩意儿都没字母,怎么呢?然后又想到,直接把上面那玩意儿搞成十六进制就好了。
![](http://www.bkjia.com/uploads/allimg/141105/164R94437-0.gif)
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,那要是需要所有字母咋办呢?哈哈,在想想也就想到把所有的字母和数字等在一个字符串中列出来,然后通过随机下标的形式去
随机获取对应的值,也就成了这样:
![](http://www.bkjia.com/uploads/allimg/141105/164R94437-0.gif)
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画出来了。
![](http://www.bkjia.com/uploads/allimg/141105/164R94437-0.gif)
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
当然,这样的话验证码就太好识别了,就只是单纯的黑底白字,为了增加点难度,我们就多加几条线叠加在验证码的上面。
![](http://www.bkjia.com/uploads/allimg/141105/164R94437-0.gif)
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
![](http://www.cnblogs.com/wuyuchang/p/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAAAbCAIAAAAS1i3eAAADlUlEQVRoge2YP0/jMBjG3RXdiJBOHewkoixlYYWliAoWdIKP0OVG1AGmmxC6rcvRjYmVT9Chw0nolnyGbqy3VKxIveERj97aieP8O0DiUVS5jv/+8ry2E6U+ta7ZvGfl7Paf32QkH1sWx93+8yfHKpIcQyD+Nn9bHtGHFVCGO7FdlI+dnRZbb1Ozea9UOEuOX3qm4dF8XI4S4iTdm6R7hVVaRJnJcbv/q+bV5BCzBIjAFwgR+t8o66v+w8h7HoTonn4KZa2SdVEO0i7T7zm0V6vVarWS6d3+MzNn8x7Tbsm8zOYtCZrj24cG2mpNmD+C1wIEP74xyuHxwfD4YJB23zNHiQ/hXIFaKyi/TQ+tHAD1VLm/uLq/uCrdUw25G0g4IKTdhKUGFkoX5fj2YZB2AdTDFEBbYto5G3v2XzpRSpVHKdPNo2Roc/+pw/Tnn++83LuTH0tca5kOvs7ZmBePii5KudWoLFj+uw2jfOzsyFVS7uYqOPDzfCqxWnBDDoDyvN05G2P+4FvoSv9f6xZUDuXi675aR2ntNhZKqNCkSjCl7yzrQcTnca7KeX22Jm9hdelkorw7Ob07OXULl7akhdKyJJRJE7KASmoE5/rUb0DLtoGvz9Zp/Gg5PFoO1frKYFUBRP6tG90SZSZHlY+SyEJMWuEFjhD9q60SHEEQEPMEghKiyvoUVAXl5vRmc3qTxxECzUzTSblMM/EV7vulPuSAYyFB5dhQqhmUSADo5vSGtyS1Qdp92dp42doIaXOS7gFooQFdoGU/bh8th7N5r4INLTWGEpYENTKVWNWrMT1AXQOGBD5VCiID2f/BopAg1QxKcHRP6cqxKhdN0gxcAf1AK0BEOo9jng1HTwvrQn7mN/OKrsxDSUmmABce75Rr0nCIIHh5fX55fY6cTI4uLBecq9KWHB1uu5mLr/vYbfwo1StBK/wrAFVlAp/4CJFcZvNeOCy/qkT36HBbAn3s7PhRuvErD0ZkWg2oygn80dNC4suERUuGr4Z5CoruJEmiKOJvkiRxHBtj4jiOoiiOYySQxi/KRFGktY5ehRa01shEGdZFRTQr+0IxrTUL4xcl0RQSWmtjjDGGnaJB+dfqkaNCC+iLA0uShP2iO7TPETLB0eIuq8v24zhWsibSnB5nyylZaORwOUSJng1ad+MsybHykXB48gnJNgmdLYOvbFA+dYlSTsEyirzLh8HxG2OQz4601v8AyNFY5f3+nDsAAAAASUVORK5CYII=)
结果也就成了这样,当然,要想实现验证码,这样还是不够滴,需要通过将验证码生成的随机数存到服务器的session中,$_SESSION['validate'] = $validateCode;然后在通过客户端输入的验证码与之对比即可。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已出来了!
找到原因了:$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);
http://www.bkjia.com/PHPjc/905903.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/905903.htmlTechArticle谈谈那些年PHP中屌屌的验证码,PHP屌屌验证码 验证码已经是现在网站中非常基础的知识点了,验证码的存在可以防止恶意破解密码、刷票、...