PHP对验证码的认证过程

PHP对验证码的认证过程

    这段时间在写php脚本,接触到web前端以及web安全问题比较多,这时给大家简单地谈一下我们网站验证码的验证过程及其安全问题。

    从三个方面去谈一下关于验证码的使用:验证码的生成,验证的过程,验证中注意的安全问题。

    验证码的生成,首先还是要说说验证码的作用。众所周知,验证码的存在,是为了防止一些机器,或是刷恶意留言、无限注册用户或是暴力破解账号密码。现在普通的验证码是由一个php脚本生成的,比如打开我们emlog的include/lib/文件夹,底下有个checkcode.php,这就是生成验证码的脚本。

    我们可以简单看一下它的代码:

session_start();

$randCode = '';
$chars = 'abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPRSTUVWXYZ23456789';
for ( $i = 0; $i < 5; $i++ ){
	$randCode .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}

$_SESSION['code'] = strtoupper($randCode);

$img = imagecreate(70,22);
$bgColor = isset($_GET['mode']) && $_GET['mode'] == 't' ? imagecolorallocate($img,245,245,245) : imagecolorallocate($img,255,255,255);
$pixColor = imagecolorallocate($img,mt_rand(30, 180), mt_rand(10, 100), mt_rand(40, 250));

for($i = 0; $i < 5; $i++){
	$x = $i * 13 + mt_rand(0, 4) - 2;
	$y = mt_rand(0, 3);
	$text_color = imagecolorallocate($img, mt_rand(30, 180), mt_rand(10, 100), mt_rand(40, 250));
	imagechar($img, 5, $x + 5, $y + 3, $randCode[$i], $text_color);
}
for($j = 0; $j < 60; $j++){
	$x = mt_rand(0,70);
	$y = mt_rand(0,22);
	imagesetpixel($img,$x,$y,$pixColor);
}

header('Content-Type: image/png');
imagepng($img);
imagedestroy($img);

    第一个for循环在chars这个字符串中随机取了5个字符,这实际上就是我们的真实验证码。然后我们可以看到:_SESSION['code'] = strtoupper(

    有的朋友要问,问什么赋值到SESSION里了不赋值到COOKIE里。这就说明你对他们二者关系不了解。cookie和session都作为网站临时保存客户端相关信息的一个“容器”,但是cookie是保存在客户端里的,也就是网站的访问者可以随意查看和修改cookie里的内容,那就没有验证码存在的意义了,因为用户可以直接从cookie中读到验证码,当然机器也可以。而session是保存在服务器上的内容,我生成好的验证码,用户不可能读取到。

    再看源码,后面的两个循环分别是生成彩色的带验证码的图片和在图片上加噪点。是为了加大机器识别验证码的难度。最后我们看到,header('Content-Type: image/png'); 把我们这个页面定义成为图片的格式。

    这样,我们就可以用html代码来让验证码显示出来:

<img src="checkcode.php" />

     类似这样:

    那么验证的过程就是,我们首先生成5个随机字符,保存到session里。然后把这5个字符画成一个图片给用户看,让用户识别,填写在表单里提交后和我们session里的验证码比对。

    其实就是这么简单。

    最后来说说验证码的安全性。我们emlog和wordpress其实验证码并不是很强大,我们这个简单的验证码可以写一个小脚本很容易地识别,所以并不适合比较大型的网站使用。像类似腾讯、百度这种网站的验证码很多字符能旋转、扭曲,并且背影上的干扰物更多,甚至是中文验证码。不过对于小型网站来说,普通等级的验证码足矣防范很多刷评论的机器。

    还有一点很重要,注意验证码使用过后要记住删除相应的session。否则验证码就失去了其意义,这也是我之前犯过的错误。

    为什么这么说。作为一个正常用户,我们每访问一次需要填写验证码的页面,生成验证码的脚本都会执行一次,也就说会生成一个新验证码赋值到session里,没有任何问题。但对于一个机器(或一个暴力破解密码脚本),它第一次访问需要填写验证码的页面,然后在session中得到一个验证码,它以后就不用再次访问这个页面了。直接把第一次的数据包更改并再次发送即可,于是,如果没有清除session的网站,每次的验证码都和第一次相同,也就丧失了验证码的本来作用。

    这是我们做网站需要注意的地方。希望大家在写程序的时候多注意网站的安全性,避免在网站发布后出现问题。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • laravel unique验证、确认密码confirmed验证以及密码修改验证的方法

    验证字段必须有一个匹配字段foo_confirmation,例如,如果验证字段是password,必须输入一个与之匹配的password_confirmatio...

    砸漏
  • saltstack的key认证过程

    将192.168.56.11作为master,将192.168.56.12作为minion

    张琳兮
  • PHP中没用的验证码

    我们常常在提交页面设置验证码防止重复提交,但有些时候设置了验证码不一定有用,看看下面的例子:

    用户7657330
  • Shiro源码分析之认证过程

    3.AuthenticatingSecurityManager类中authenticate方法

    用户4919348
  • PHP 图片验证码的问题

    发现没有问题,查看php.ini中的扩展,发现extension=php_gd2.dll 已经开启了

    meteoric
  • 对身份证号码合法性的验证

    对于身份证号码,经常有人只是判断身份证的位数是否为15或18位,是否全部都是数字,这种判断是错误的,因为18位身份证号码允许最后一位为X,不过必须根据特定的算法...

    源哥
  • ssh服务认证---基于密钥的认证过程讲解

        从上面可知,客户端分发公钥到服务端时,会接收到服务端的rsa公钥,并将此公钥保存到文件/root/.ssh/known_hosts中,通过查看服务端/e...

    醉生萌死
  • PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)

    $black = imagecolorallocate($img, 0x00, 0x00, 0x00);

    用户8824291
  • php 最新极验滑动验证码 教程 tp5 教程

    首先,先去注册开发者,获取key 与 ID 注册我就不用教大家啦吧 ,大家都会是的。

    用户7886150
  • 图解 Kerberos 三个密码验证的过程

    Client 发送请求到 AS(Authentication Server),注意这个请求是用 Client 的密码A加密过的,无需在网络中传递 Client ...

    runzhliu
  • 支付宝二维码脱机认证库测试过程记录(andorid平台adb shell验证)

    最近在调试支付宝给提供的二维码脱机认证库,他们给提供了几个文档和 libposoffline.so库文件。

    杨永贞
  • PHP通过GD库实现验证码功能示例

    captcha.php后面加上一个随机参数是为了实现换一个验证码的功能,,换一个功能通过简单的js即可实现。如果没有这个功能可以不用参数。

    砸漏
  • 轻松理解 Kerbreos 的认证过程

    前几天在给人解释 Windows 是如何通过 Kerberos 进行 Authentication 的时候,讲了半天也别把那位老兄讲明白,还差点把自己给绕进去。

    信安之路
  • 你被12306的验证码坑过么?

    相信很多在中小型企业或者TO B企业的小伙伴们都未曾接触过限流。举个例子,小伙伴们就会发现,原来软件限流就在身边。相信很多小伙伴们都有12306买票回家的体验吧...

    程序员老猫
  • Spring Security源码分析一:Spring Security认证过程

    为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类

    java干货
  • 如何优雅的面对验证码

    腾讯云安全
  • Django认证系统user对象实现过程解析

    User对象是认证系统的核心。它们通常表示与你的站点进行交互的用户,并用于启用限制访问、注册用户信息和关联内容给创建者等。在Django的认证框架中只存在一种类...

    砸漏
  • 数字证书系列--利用自签名证书实现认证的大致过程

    对于自签名证书,完成自签名后,我们会获得如下的几个文件: CA 证书文件,CA证书的私钥,个人证书的私钥,获得CA签名的个人证书 ,证书请求文件(.csr) ...

    qsjs

扫码关注云+社区

领取腾讯云代金券