- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Discuz! X2验证码的产生和验证及随机数产生探讨由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、验证码的产生 1、如何在模板中添加一个验证码 在X2中验证码的模板部分独立为一个模板文件(template/default/common/seccheck.htm),供各个地方调用。 在模板中可以添加如下代码来调用验证码模板部分: 。
解释下这三句话: 第一句的意思为,我要开启验证码,即 $seccodecheck 变量 必须为真,就表示当前页面要开启验证码。 第二句的意思为,给要显示出来的验证码设置一个显示的模板格式,$sectpl 这个变量对应的就是模板,设置 $sectpl 可以让验证码的显示与当前页面的格式更好的结合。从示例的模板代码中可以看出,只有 <sec> 不属于 HMTL 标准代码,而且出现了 3 次,这 3 次分别代表:“验证码”文字、验证码输入框、验证码图片,如下图所示: 这样就可以把验证码不同的部分合理的安放在您的页面中了。 第三句的意思为,将独立的验证码模板合并到当前页面中,与当前页面的模板一同输出。 在模板中添加上如上的代码后,刷新页面就可以看到验证码部分了。 2、验证码的生成流程 (以X2默认设置的“英文图片验证码”为例) 1)刚出现的验证码会默认执行一段 JS 代码 。
执 行的 JS 主要就是执行了 updateseccode 这个函数,直接点击验证码图片执行的也是这个函数。函数中的 'SQq29j20' 是当前页面验证码的唯一字符串 idhash,他是由是否为Ajax请求、session id、自增数字组成,此处不必深究其含义。 2)updateseccode 函数在 static/js/common.js 中 。
通过上面代码可以看到,updateseccode 又调用了 _updateseccode 私有函数,_updateseccode 函数在 static/js/common_extra.js 文件中 。
这段 JS 代码有两个含义: 一是通过 ajaxget 请求了 misc.php?mod=seccode&action=update&idhash=xxxx 这样一个地址 二是设定了一个 定时器 ,从显示了验证码开始,3分钟后自动将验证码图片换为“刷新验证码”的文字,点击该文字就执行 updateseccode 这个函数,重新更新验证码。由此可以看出,此种方式可以很好的解决验证码过期的问题。 3)找到通过 ajaxget 请求的程序 source/module/misc/misc_seccode.php 通过 url 中的 action=update 可以看出,应该查看 if($_G['gp_action'] == 'update') { …… } 中的一段 。
这部分开始是先做了一些安全性的验证,最后是根据给定的参数和由 make_seccode 生成的验证码字符串,生成验证码的图片,所以中间是重点。 make_seccode($_G['gp_idhash']) 这个函数传入了当前页面验证码的唯一字符串 idhash,生成了用于验证码的字符串。 5)make_seccode 函数在 source/function/function_seccode.php 文件 。
从函数中可以看到,验证码 $seccode 首先来自一个6位的随机数字 random(6, 1) (此函数如何工作,最后讲解)。 默认设置的“英文图片验证码”的 $_G['setting']['seccodedata']['type'] 为 0,所以看 else 的部分。将 $seccode 的数字通过 base_convert 函数由 10 进制 转为 24 进制,然后设定可以在验证码出现的字符串 。
最后将 24 进制的验证码在 $seccodeunits 中取得真正的 4 位验证码字符串 $seccode ,最后将 $seccode 通过 authcode 加密函数进行加密,写入 cookie 中,并返回,cookie 的名字是 seccode 连上 $idhash 的值(例如:seccodeSQq29j20)。加密时使用的是在 config/config_global.php 中设置的 $_G['config']['security']['authkey'] 的值。 至此验证码及图片生成完毕,生成的验证码到目前为止只以加密的方式存在于 cookie 中。 2、验证码的验证 1、JS 方式的验证 1)这种验证就是在文本框中输入验证码后,及时的验证。 这个验证是由文本框的 onblur 失去焦点事件触发 checksec('code', 'SQq29j20') JS 函数进行验证的。 2)checksec 函数在 static/js/common.js 中 。
通过上面代码可以看到,checksec 又调用了 _checksec 私有函数,_checksec 函数在 static/js/common_extra.js 文件中 。
这 个函数首先验证下,输入框内填写的验证码的值 $('sec' + type + 'verify_' + idhash).value 是否存在(type 就是传入的 code)。然后通过 ajax 请求访问 misc.php?mod=seccode&action=check&inajax=1&&idhash=xxxx&secverify=xxxx 这样一个地址,这个地址会返回验证的结果字符串。如果返回结果的前 7 个字符是 succeed 则验证通过,显示对勾;否则提示“验证码错误,请重新填写”,并显示红叉。 3)找到通过 ajax 请求的程序 source/module/misc/misc_seccode.php 通过 url 中的 action=check 可以看出,应该查看 elseif($_G['gp_action'] == 'check') { …… } 中的一段 。
这 里将通过 url 传入的 secverify 和 idhash 两个值传递给 check_seccode 函数,通过代码看到 check_seccode 返回布尔值,故结果为真,则通过验证,返回 succeed 字符串,结果为假,则验证失败,返回 invalid 字符串。 4)check_seccode 函数在 source/function/function_core.php 文件 。
此函数首先根据缓存中的设定验证验证码的开启状态,如果未开启,此处验证直接返回真,既然没有开启验证码自然如何验证均为真。 然后验证 cookie 中是否存在生成验证码时写入 cookie 的值(例如:seccodeSQq29j20),如果 cookie 没有此值,则此次验证失效,需要重新生成验证码,重新验证。 最后从 cookie 取出值,使用 $_G['config']['security']['authkey'] 加密串,通过 authcode 函数对值进行解密,解密后获取到验证码、生成时间、idhash、formhash 四个值。然后需要同时满足以下四个条件才可以通过验证: - 输入的验证码等于解密出来的验证码 - 验证码的生成时间距当前时间小于 180 秒 - 传入的 idhash 等于解密出来的 idhash - 当前系统生成的 formhash 等于解密出来的 formhash 至此通过 JS 方式的验证码验证完成。 2、PHP 方式的验证 1)这种方式就是在验证码所在的表单提交后,对输入的验证码进行的验证。 例如在修改用户密码时开启了验证码,则会在其处理的 PHP 程序中发现(source/include/spacecp/spacecp_profile.php)这样一句代码 submitcheck('passwordsubmit', 0, $seccodecheck, $secqaacheck) submitcheck 函数就是对提交的表单进行验证的。 2)submitcheck 函数在 source/function/function_core.php 文件 。
submitcheck 函数一般只填写前两个参数即可,第一个参数表示要验证的表单元素的名字,此表单元素不存在则验证失败;第二个参数表示是否允许通过 GET 方式提交的数据通过验证,0 为不允许,1 为允许,一般为 0 即可。 后两个参数用于表示提交的表单中是否需要对验证码和验证问答做验证,第三个参数 $seccodecheck 代表验证码,第四个参数 $secqaacheck 代表验证问答,参数值都是 0 为不验证,1 为验证。 所以如果需要在提交后验证验证码,则至少要填写 3 个参数,即 submitcheck('passwordsubmit', 0, 1) 。 进入函数中会现对提交表单的提交方式、formhash、访问来源 referer 等数据进行安全性验证,通过后则会调用 check_seccode 函数对提交过来的验证码进行验证了,根据 check_seccode 的返回值,来给予不同的提示。 check_seccode 函数如何工作的参看 JS 验证中的 4) 即可。 至此通过 PHP 方式的验证码验证完成。 3、随机数如何产生的 Discuz! X的随机数是通过 random 函数产生的,函数在 source/function/function_core.php 文件 。
此函数有两个参数,$length 表示要获取的随机数的位数,$numeric 表示是否要获取纯数字的随机数,取值 0 或 1。 函数首先使用 microtime 函数获取当前的微秒级时间戳字符串,然后在后面拼接上单前网站的根目录路径,然后进行 MD5 加密,获得 32 位长的字符串。之后对其进行转进制,如果要获取纯数字的随机数,则从 16 进制转为 10 进制,如果要获得数字和英文混杂的随机数,则从 16 进制转为 35 进制。之后再将转进制后获得的字符串,根据是否要获取纯数字随机数的区别,进行拼接。最后从拼接后的字符串中随机抽取随机数的第一位、第二位以此类推,直 至获取满足要求的随机数的位置为止。至此生成了随机数.
最后此篇关于Discuz! X2验证码的产生和验证及随机数产生探讨的文章就讲到这里了,如果你想了解更多关于Discuz! X2验证码的产生和验证及随机数产生探讨的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
默认情况下,Android系统在超过N分钟没操作,会自动关屏并进入休眠状态。 实际上,有些项目要求超时不休眠,如果只是针对单个应用程序,我们可以通过电源管理设置状态来实现, 而如果要设置所有应用的超
1、分析 1、最简单的布局:只有一个listview 如果整个页面只有一个listview的话,那么由于listview本身带有滚动效果,所以当加载的数据超过页面显示的范围时,可以通过上下滑动
一个Bug 前几日出现这样一个Bug是一个RuntimeException,详细信息是这样子的: 复制代码 代码如下: java.lang.IllegalArgumentExcept
已知两个链表list1和list,2,各自非降序排列,将它们合并成另外一个链表list3,并且依然有序,要求保留所有节点。 实现过程中,list1中的节点和list2中的节点都转移到了list3中,
php在做后台服务器的时候,经常会遇到这种情况,需要解析来自前台的xml文件,并将数据以xml格式返回,在这种情况下,xml与php中关联数组的转化是非常频繁的事情。比如flex和其他客户端程序与服
命令行方式: 在phpDocumentor所在目录下,输入phpdoc –h会得到一个详细的参数表,其中几个重要的参数如下: -f 要进行分析的文件名,多个文件用逗号隔开 -d 要分析的目录,多
用C/C++扩展PHP的优缺点: 优点: 效率,还是效率 减少PHP脚本的复杂度, 极端情况下, 你只需要在PHP脚本中,简单的调用一个扩展实现的函数,然后你所有的功能都就被扩展实现了 而缺点也是显
Memcached有个stats命令,通过它可以查看Memcached服务的许多状态信息。使用方法如下: 先在命令行直接输入telnet 主机名端口号,连接到memcached服务器,然后再连接成功
通过status命令,查看Slow queries这一项,如果值长时间>0,说明有查询执行时间过长 复制代码代码如下: 以下为引用的内容: mysql> status;
myisam 存储数据有三个文件.MYD,.MYI ,.FRM 数据文件和索引文件分开存储 innodb存储数据有.FRM存放表定义,.ibd(独享表空间),.ibdata(共享表空间).innod
Oracle数据库查看一个进程是如何执行相关的实际SQL语句 复制代码代码如下: SELECT b.sql_text, sid, serial#, osuser, machine &
答案: 在内建数据类型的情况下,效率没有区别; 在自定义数据类型的情况下,++i效率更高! 分析: (自定义数据类型的情况下) ++i返回对象的引用; i++总是要创建一个临时对象,在退
函数 返回值 和 返回引用 是不同的 函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概
两年前从网上看到一道面试题:用两个栈(Stack)实现一个队列(Queue)。觉得不错,就经常拿来面试,几年下来,做此题的应该有几十人了。通过对面试者的表现和反应,有一些统计和感受,在此做个小结。
网站提供上存功能,是很多站点经常会有功能,商城,论坛还有常见一些网盘站点。常见互联网上面,我们也是经常听说,某某站点出现上存漏洞,某某开源项目有上存漏洞。 从互联网开始出现动态程序,上存漏洞像幽灵一
概念:XML序列化是将公共字段和属性转化为序列格式(这里指XML),以便存储或传输的过程。反序列化则是从XML中重新创建原始状态的对象. 复制代码 代码如下: &nbs
1、查看實例名時可用 1、服务—SQL Server(实例名),默认实例为(MSSQLSERVER) 或在连接企业管理时-查看本地实例 2、通過注冊表 HKEY_LOCAL_MACHINE/
一 应用规划: ※ 确定功能。 ※ 必须的界面及界面跳转的流程。 ※ 需要的数据及
parse_url (PHP 4, PHP 5) parse_url — 解析 URL,返回其组成部分 说明 array parse_url ( string $url ) 本函数解析一个 URL
自 PHP 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。 复制代码 代码如下: <?php $arr = arr
我是一名优秀的程序员,十分优秀!