注册模块(1)的改进:认证代码存储在会话中。
需要修改的几个文档:(1)register.php产生随机数和加密的值
改变register.html到register.php,和开放的会议;
在register.js生成随机数的函数编写的register.php,和PHP的方法。
的…
< PHP
随机数生成函数
功能showval(){
= $;
($ i = 0;$ i < 4;$ + +){
$ TMP =兰特(15);
如果($ 9){
开关($ TMP){
案例(10):
为民= A;
打破;
案例(11):
为民= B;
打破;
案例(12):
为民= C;
打破;
案例(13):
美元=;
打破;
案例(14):
为民= e;
打破;
案例(15):
为民= F;
打破;
}
{ { { }
美元= TMP;
}
}
返回$;
}
随机数生成
mdnum美元= MD5(showval());
会话中加密后随机数和随机数
_session美元{ 'num} = showval();
_session美元{ 'mdnum} = $ mdnum;
>
样式=光标:指针标题验证代码alt验证代码>
生成的4位验证码和MD5加密验证码存储在会话中,而客户端验证码的SRC属性参数是加密值,因此客户端不会有四位验证码。
(2)valcode.php写入随机数分为图形
在register.php,对验证码图片地址是
>
因此,在valcode.php,有必要进行相应的修改,并修改原:
/ /直接传输客户端的输入值$民= _get美元'num'} {;
修改:
session_start();
页眉(内容类型:图像);
4位随机数生成 / /会话和随机数加密MS5
如果(isset($ _session { 'mdnum ' }){ } _session美元'mdnum!){
mdnum美元美元'mdnum_session { } =;
如果(isset($ _get { 'num ' }){ } _get美元'num!){
当注册页面通过随机数在相等时加密数字和会话时
如果($ _get { 'num} = = $ mdnum){
如果(isset($ _session { 'num ' }){ } _session美元'num!=)
存储在会话中的$ 4位随机数
Num =美元美元_session { 'num};
}
}
}
也就是说,客户端图像传输的加密参数与存储在会话中的加密值相同,然后将存储在会话中的4位验证代码写入图形。
对于valcode.php完整代码:
< PHP
session_start();
页眉(内容类型:图像);
4位随机数生成 / /会话和随机数加密MS5
如果(isset($ _session { 'mdnum ' }){ } _session美元'mdnum!){
mdnum美元美元'mdnum_session { } =;
如果(isset($ _get { 'num ' }){ } _get美元'num!){
当注册页面通过随机数在相等时加密数字和会话时
如果($ _get { 'num} = = $ mdnum){
如果(isset($ _session { 'num ' }){ } _session美元'num!=)
存储在会话中的$ 4位随机数
Num =美元美元_session { 'num};
}
}
}
imagewidth = 150美元;
ImageHeight = 54美元;
创建图像
numimage美元=画面欣赏(imagewidth美元,$ ImageHeight);
用于图像分发颜色
imagecolorallocate(numimage美元,240240240);
字体大小
font_size = 33美元;
字体名称
$fontname ='arial.ttf';
生成的图片文本
为($我= 0;$我< strlen($num);$ i++){
获取文本/ x坐标的左上角
X元= mt_rand(20,20)+ $ imagewidth * $我/ 5;
获取y坐标的左上角的文本
Y元= mt_rand(40,$ ImageHeight);
对于文本颜色分布
颜色= imagecolorallocate美元(美元numimage,mt_rand(0150),mt_rand(0150),mt_rand(0150));
写入文本
imagettftext(numimage美元,font_size美元,0,X,Y元,美元美元美元的颜色,大小,数量{我});
}
代码生成干扰
($ i = 0;$ i < 2200;$ + +){
randcolor = imagecolorallocate美元(美元numimage,伦德(200255),伦德(200255),伦德(200255));
imagesetpixel(numimage美元,伦德()伦德()% % 180,90,randcolor美元);
}
输出画面
imagepng($ numimage);
销毁一图像($ numimage);
>
register.js验证
验证的一部分改为使用ajax验证,通过输入4位验证码的chkyzm.php文件,比较4位验证码存储在会话。
当画面刷新,4位验证码是再生和书面与加密认证编码会话。重码生成验证码是写在refresh.php,使用AJAX的register.js要求产生4位加密和验证码验证码,和加密的代码值的jQuery图像src属性参数、会话和valcode.php与参数生成4位代码的图片
register.js验证码的代码部分:
代码按钮
$(# refpic)。Hover(function(){)
$(这)。Attr(src
}函数(){()
$(这)。Attr(src
})。Mousedown(function(){)
$(这)。Attr(src
})。Mouseup(function(){)
$(这)。Attr(src
});
刷新代码
功能postyzm(){
美元。
$(# yzmpic)。Attr(src
})
}
$(# yzmpic)。Click(function(){)
Postyzm();
});
$(#改变)。Click(function(){)
Postyzm();
});
检查/验证码
功能yzmchk(){
美元。后(, / / chkyzm PHP ..。
传输数据
YZM:$(# YZM)。瓦迩()
},功能(数据,textstatus){
如果(数据= 0){
成功($(# yzmchk ),);
yzmval =真;
否则如果(数据=1){
无功noticemsg =验证码不能为空;
通知($(# yzmchk ),noticemsg);
其他{ }
无功errormsg =请输入正确的验证码;
误差($(# yzmchk ),errormsg);
}
});
}
模糊事件代码
$(# YZM)。焦点(函数(){)
无功noticemsg = '无乱;
通知($(# yzmchk ),noticemsg);
}Click(函数(){)
无功noticemsg = '无乱;
通知($(yzmdchk ),noticemsg);
})。Keydown(function(){)
如果(的情况下= = 13){
芝加哥
Yzmchk();
}
})。Keyup(function(){)
如果(的情况下= = 13){
提交
formsub();
}
}Blur(函数(){)
Yzmchk();
});
chkyzm.php
< PHP
session_start();
标题(字符集= UTF-8);
如果(isset($ _post { 'yzm ' }){ } _post美元'yzm!){
YZM = { 'yzm美元美元_post};
如果(isset($ _session { 'num ' }){ } _session美元'num!){
当输入验证码和会话保存的数字一致时
如果(strtolower($ YZM)= = $ _session { 'num ' }){
输入右键
$ = 0;
其他{ }
输入错误
$ = 2;
}
}
其他{ }
无输入
$ = 1;
}
回波$状态;
>
refresh.php
< PHP
session_start();
生成的验证码
功能showval(){
= $;
($ i = 0;$ i < 4;$ + +){
$ TMP =兰特(15);
如果($ 9){
开关($ TMP){
案例(10):
为民= A;
打破;
案例(11):
为民= B;
打破;
案例(12):
为民= C;
打破;
案例(13):
美元=;
打破;
案例(14):
为民= e;
打破;
案例(15):
为民= F;
打破;
}
{ { { }
美元= TMP;
}
}
返回$;
}
_session美元{ 'num} = showval();
_session美元{ 'mdnum} = MD5(showval());
echo $ _session { 'mdnum};
显示的效果如下:
总结:
5步:4验证码写入会话生成的图像,对客户端的认证码加密参数的使用图片,以比较在4验证码会话输入字符,刷新图片生成4位代码并存储在会话,重新加密验证码图片的src参数
使用可以表示为:
(待续)