PHP实现验证码功能

原文连接:http://www.qqdeveloper.com/a/54.htmlphp

什么是验证码?html

借用百度的解释:验证码这个词最先是在2002年由卡内基梅隆大学的路易斯·冯·安、Manuel Blum Nicholas J.Hopper以及IBM的John Langford所提出。卡内基梅隆大学曾试图申请此词使其成为注册商标, 但该申请于2008年4月21日被拒绝。一种经常使用的CAPTCHA测试是让用户输入一个扭曲变形的图片上所显示的文字或数字,扭曲变形是为了不被光学字符识(OCR, Optical Character Recognition)之类的电脑程序自动辨识出图片上的文数字而失去效果。因为这个测试是由计算机来考人类,而不是标准图灵测试中那样由人类来考计算机,人们有时称CAPTCHA是一种反向图灵测试。前端

 

常见的验证码哪些?编程

图像类型、语音类型、视频类型、短信类型等。下面分享几种实际案例中的图片示例。浏览器

 

 

使用验证码的好处在哪里?服务器

要说到使用验证码的好处,这确定是不少的,总结如下几点。
微信

  1. 防止恶意的破解密码。如一些黑客为了获取到用户信息,经过不一样的手段向服务器发送数据,验证猜想用户信息的准确性。session

  2. 防止恶意的刷票,论坛灌水。这种在论坛中长期存在灌水的现象,好比贴吧,不断发送帖子。如今百度贴吧已经针对用户发帖的时间作了一个时间的限制,当必定时间内发帖过可能是没法继续发帖的。函数

  3. 防止恶意的请求。如用户提交一个表单信息,经过不断向后台请求数据信息形成服务器资源的浪费,以及恶意的攻击。post

  4. 趣味性。这一点属于我的观点,当咱们提交表单的时候,如遇到一些有趣的验证码方式,可以加强用户对网站的喜好程度。

  5. 获取用户信息。这一点在现目前的站点中是家常便饭的事情了。如咱们注册一个站点的帐号,须要经过手机验证码才能够注册成功。网站在拿到用户的电话号码以后会给手机号主发送一些营销信息。

 

环境配置

只须要本地安装了PHP的GD扩展库便可使用。如何查看呢,建立一个PHP文件在该文件中写入<?php phpinfo();?>,访问该文件,若是查看到了GD库已经安装了,则可使用。没有的,自行安装,百度不少教程。

 

相关函数手册参考PHP官方连接 http://php.net/manual/zh/ref.image.php

 

具体代码实现

1.咱们先建立一个html页面显示验证码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form action="./login.php" method="post">
        <img src="image_captcha.php"  onclick="this.src='image_captcha.php?'+new Date().getTime();" width="200" height="200"><br/>
        <input type="text" name="captcha" placeholder="请输入图片中的验证码"><br/>
        <input type="submit" value="验证">
    </form>
</body>
</html>

2.建立一个PHP文件,接受前端页面传入的验证码信息

<?php
/**
 * 接受用户登录时提交的验证码
 */
session_start();
//1. 获取到用户提交的验证码
$captcha = $_POST["captcha"];
//2. 将session中的验证码和用户提交的验证码进行核对,当成功时提示验证码正确,并销毁以前的session值,不成功则从新提交
if(strtolower($_SESSION["captchaimg"]) == strtolower($captcha)){
	echo "验证码正确!";
	$_SESSION["captcha"] = "";
}else{
	echo "验证码提交不正确!";
}

3.建立验证码生成PHP文件

<?php
/**
 * 字母+数字的验证码生成
 */
// 开启session
session_start();
//1.建立黑色画布
$image = imagecreatetruecolor(100, 30);

//2.为画布定义(背景)颜色
$bgcolor = imagecolorallocate($image, 255, 255, 255);

//3.填充颜色
imagefill($image, 0, 0, $bgcolor);

// 4.设置验证码内容

//4.1 定义验证码的内容
$content = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

//4.1 建立一个变量存储产生的验证码数据,便于用户提交核对
$captcha = "";
for ($i = 0; $i < 4; $i++) {
    // 字体大小
    $fontsize = 10;
    // 字体颜色
    $fontcolor = imagecolorallocate($image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
    // 设置字体内容
    $fontcontent = substr($content, mt_rand(0, strlen($content)), 1);
    $captcha .= $fontcontent;
    // 显示的坐标
    $x = ($i * 100 / 4) + mt_rand(5, 10);
    $y = mt_rand(5, 10);
    // 填充内容到画布中
    imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);
}
$_SESSION["captcha"] = $captcha;

//4.3 设置背景干扰元素
for ($$i = 0; $i < 200; $i++) {
    $pointcolor = imagecolorallocate($image, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
    imagesetpixel($image, mt_rand(1, 99), mt_rand(1, 29), $pointcolor);
}

//4.4 设置干扰线
for ($i = 0; $i < 3; $i++) {
    $linecolor = imagecolorallocate($image, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
    imageline($image, mt_rand(1, 99), mt_rand(1, 29), mt_rand(1, 99), mt_rand(1, 29), $linecolor);
}

//5.向浏览器输出图片头信息
header('content-type:image/png');

//6.输出图片到浏览器
imagepng($image);

//7.销毁图片
imagedestroy($image);  

更改内容能够关注微信公众号:小7带你玩编程

相关文章
相关标签/搜索