使用php给网站加入访问验证码


要在网站上添加验证码验证以确保用户是人类而不是自动程序,可以使用PHP和GD库来生成图像验证码并将其嵌入到网页中。

下面是一个简单的PHP代码示例,可以生成一个四位数的随机数字验证码,并将其嵌入到HTML表单中:

session_start();
$length = 4;
// 生成随机验证码
$code = "";
for ($i = 0; $i < $length; $i++) {
    $code .= rand(0, 9);
}
// 将验证码保存到Session中
$_SESSION['code'] = $code;
// 生成验证码图像
$im = imagecreatetruecolor(80, 30);
$bg_color = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $bg_color);
$text_color = imagecolorallocate($im, 0, 0, 0);
imagestring($im, 5, 20, 8, $code, $text_color);
// 发送图像到浏览器
header("Content-type: image/png");
imagepng($im);
imagedestroy($im);

在网页中,可以将上述PHP代码嵌入到一个<img>标签的src属性中,以便生成验证码图像,如下所示:

<img src="generate_code.php" alt="验证码">

此时,用户在访问需要验证码验证的页面时,需要输入验证码才能继续访问。可以在表单中添加一个文本输入框,并在提交表单时将用户输入的验证码与Session中保存的验证码进行比较,以确保用户输入的验证码正确,如下所示:

<form action="process_form.php" method="post">
  <label for="code">验证码:</label>
  <input type="text" id="code" name="code">
  <input type="submit" value="提交">
</form>

在处理表单提交的PHP代码中,可以使用$_SESSION['code']来获取Session中保存的验证码,并将用户输入的验证码与之进行比较,如下所示:

session_start();
if ($_POST['code'] == $_SESSION['code']) {
    // 验证码正确,继续处理表单
} else {
    // 验证码错误,给出错误提示
}

需要注意的是,上述代码只是一个简单的示例,实际应用中可能需要增加一些安全性和可用性方面的措施,例如防止智能识别恶意程序暴力破解验证码、可以为图像验证码添加干扰线条和噪声,增加恶意程序自动识别的难度,下面是生成带有干扰线条和噪声的图像验证码代码示例:

session_start();
$length = 4;
// 生成随机验证码
$code = "";
for ($i = 0; $i < $length; $i++) {
    $code .= rand(0, 9);
}
// 将验证码保存到Session中
$_SESSION['code'] = $code;
// 生成验证码图像
$im = imagecreatetruecolor(120, 50);
$bg_color = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $bg_color);
$text_color = imagecolorallocate($im, 0, 0, 0);
// 添加干扰线条
for ($i = 0; $i < 3; $i++) {
    $line_color = imagecolorallocate($im, rand(0, 255), rand(0, 255), rand(0, 255));
    imageline($im, rand(0, 120), rand(0, 50), rand(0, 120), rand(0, 50), $line_color);
}
// 添加噪声
for ($i = 0; $i < 80; $i++) {
    $noise_color = imagecolorallocate($im, rand(0, 255), rand(0, 255), rand(0, 255));
    imagesetpixel($im, rand(0, 120), rand(0, 50), $noise_color);
}
imagestring($im, 20, 30, 15, $code, $text_color);
// 发送图像到浏览器
header("Content-type: image/png");
imagepng($im);
imagedestroy($im);

在上述代码中,添加了两个循环来生成干扰线条和噪声。imageline()函数可以在图像上绘制直线,其参数包括图像资源、起点坐标和终点坐标、颜色等。imagesetpixel()函数可以在图像上绘制单个像素点,其参数包括图像资源、坐标、颜色等。

需要注意的是,添加的干扰线条和噪声应该适度,过多的干扰会使验证码难以识别,过少的干扰则可能无法有效防止自动程序破解。在实际应用中,可以根据需要进行调整。