Discuz! X2验证码的产生和验证及随机数产生探讨

2019-02-17 21:05:00王振洲
一、验证码的产生
1、如何在模板中添加一个验证码
在X2中验证码的模板部分独立为一个模板文件(template/default/common/seccheck.htm),供各个地方调用。
在模板中可以添加如下代码来调用验证码模板部分:


<!--{eval $seccodecheck = 1;}-->
<!--{eval $sectpl = '<tr><th><sec></th><td><sec><p class="d"><sec></p></td>';}-->
<!--{subtemplate common/seccheck}-->

解释下这三句话:

第一句的意思为,我要开启验证码,即 $seccodecheck
变量
必须为真,就表示当前页面要开启验证码。

第二句的意思为,给要显示出来的验证码设置一个显示的模板格式,$sectpl 这个变量对应的就是模板,设置 $sectpl 可以让验证码的显示与当前页面的格式更好的结合。从示例的模板代码中可以看出,只有 <sec> 不属于 HMTL 标准代码,而且出现了 3 次,这 3 次分别代表:“验证码”文字、验证码输入框、验证码图片,如下图所示:
 
这样就可以把验证码不同的部分合理的安放在您的页面中了。

第三句的意思为,将独立的验证码模板合并到当前页面中,与当前页面的模板一同输出。

在模板中添加上如上的代码后,刷新页面就可以看到验证码部分了。

2、验证码的生成流程
(以X2默认设置的“英文图片验证码”为例)

1)刚出现的验证码会默认执行一段 JS 代码


<script type="text/javascript" reload="1">updateseccode('SQq29j20');</script>

执 行的 JS 主要就是执行了 updateseccode 这个函数,直接点击验证码图片执行的也是这个函数。函数中的 'SQq29j20' 是当前页面验证码的唯一字符串 idhash,他是由是否为Ajax请求、session id、自增数字组成,此处不必深究其含义。

2)updateseccode 函数在 static/js/common.js 中


function updateseccode(idhash, play) {
$F('_updateseccode', arguments);
}

通过上面代码可以看到,updateseccode 又调用了 _updateseccode 私有函数,_updateseccode 函数在 static/js/common_extra.js 文件中


function _updateseccode(idhash, play) {
if(isUndefined(play)) {
if($('seccode_' + idhash)) {
$('seccodeverify_' + idhash).value = '';
if(secST['code_' + idhash]) {
clearTimeout(secST['code_' + idhash]);
}
$('checkseccodeverify_' + idhash).innerHTML = '<img src="'+ IMGDIR + '/none.gif" width="16" height="16" class="vm" />';
ajaxget('misc.php?mod=seccode&action=update&idhash=' + idhash, 'seccode_' + idhash, null, '', '', function() {
secST['code_' + idhash] = setTimeout(function() {$('seccode_' + idhash).innerHTML = '<span class="xi2 cur1" onclick="updateseccode(''+idhash+'')">刷新验证码</span>';}, 180000);
});
}
} else {
eval('window.document.seccodeplayer_' + idhash + '.SetVariable("isPlay", "1")');
}
}