首页 > 文章列表 > 使用PHP实现验证码的生成和验证

使用PHP实现验证码的生成和验证

PHP、验证码、验证
236 2023-05-23

验证码是一种在网络安全中常用的技术,它能够有效地防止机器恶意攻击,保护用户隐私和数据安全。在本文中,我们将介绍如何使用PHP语言实现验证码的生成和验证。

生成验证码

生成验证码的过程包括产生随机数和绘制验证码图像两个部分。在PHP中,我们可以使用GD库实现图像绘制。

首先,我们使用rand函数生成一个四位数的随机数,并将其存入SESSION中,以便后续验证时使用。

<?php
session_start();
$code = rand(1000,9999);
$_SESSION['code'] = $code;
?>

然后,我们使用GD库绘制出验证码图像。具体来说,我们需要创建一个画布,设置背景色和字体颜色,将随机数绘制到画布上,并加入一些干扰线和噪点,以增强验证码的安全性。

<?php
//创建一个背景为白色的图像
$image = imagecreatetruecolor(80, 30);
$bgcolor = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bgcolor);

//往图像中添加四位数的验证码
$fontcolor = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 5, 8, $code, $fontcolor);

//加入干扰线和噪点
for($i=0;$i<6;$i++) {
    $linecolor = imagecolorallocate($image, rand(0,255), rand(0,255), rand(0,255));
    imageline($image, rand(0,80), rand(0,30), rand(0,80), rand(0,30), $linecolor);
}
for($i=0;$i<50;$i++) {
    $noisecolor = imagecolorallocate($image, rand(0,255), rand(0,255), rand(0,255));
    imagesetpixel($image, rand(0,80), rand(0,30), $noisecolor);
}

//输出图像,并释放资源
header('Content-Type:image/png');
imagepng($image);
imagedestroy($image);
?>

以上代码会生成一个80*30大小的PNG图片作为验证码图像,并将其输出到浏览器中。

验证验证码

接下来,我们将介绍如何验证用户输入的验证码是否正确。用户输入的验证码需要与SESSION中保存的随机数进行比较,只有两者一致才算验证通过。

<?php
session_start();
if($_POST['code'] == $_SESSION['code']) {
    echo "验证码正确";
} else {
    echo "验证码错误";
}
?>

在用户提交表单时,我们获取用户输入的验证码,并将其与SESSION中保存的随机数进行比较。如果两者一致,就认为验证码验证通过了。

综合示例

下面是一个完整的示例,演示如何创建一个包含验证码的表单,并验证用户输入的验证码是否正确。

HTML代码:

<form action="check.php" method="post">
    <label>用户名:</label><input type="text" name="username"><br>
    <label>密码:</label><input type="password" name="password"><br>
    <label>验证码:</label><input type="text" name="code" style="width:60px;">
    <img src="code.php" onclick="this.src='code.php?time='+Math.random();"><br>
    <input type="submit" value="登录">
</form>

PHP代码:

code.php

<?php
session_start();
$code = rand(1000,9999);
$_SESSION['code'] = $code;

$image = imagecreatetruecolor(80, 30);
$bgcolor = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bgcolor);

$fontcolor = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 5, 8, $code, $fontcolor);

for($i=0;$i<6;$i++) {
    $linecolor = imagecolorallocate($image, rand(0,255), rand(0,255), rand(0,255));
    imageline($image, rand(0,80), rand(0,30), rand(0,80), rand(0,30), $linecolor);
}
for($i=0;$i<50;$i++) {
    $noisecolor = imagecolorallocate($image, rand(0,255), rand(0,255), rand(0,255));
    imagesetpixel($image, rand(0,80), rand(0,30), $noisecolor);
}

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

check.php

<?php
session_start();
if($_POST['code'] == $_SESSION['code']) {
    echo "验证码正确";
} else {
    echo "验证码错误";
}
?>

通过以上示例,我们可以看到如何使用PHP语言实现验证码的生成和验证,并将其应用到网站开发中,从而提高网站的安全性和用户体验。