首頁 > 後端開發 > PHP問題 > 如何使用PHP實作使用者登入驗證碼功能

如何使用PHP實作使用者登入驗證碼功能

PHPz
發布: 2023-04-21 09:53:26
原創
2062 人瀏覽過

隨著網路技術的發展,網站的安全問題也越來越受到重視。作為一個網站開發者,我們需要確保使用者的帳號資訊和個人隱私的安全性。其中,使用者登入過程的安全性也非常重要。為了保護使用者帳號的安全,我們需要在使用者登入頁面中新增驗證碼功能。本篇文章將介紹如何使用 PHP 實作使用者登入驗證碼功能。

  1. 什麼是驗證碼

驗證碼是一種區分人類和電腦程式的技術,可以有效防止惡意攻擊者使用自動化程式對網站發動攻擊。常見的驗證碼有數字、字母、圖形等不同形式,使用者需要在登入時正確輸入驗證碼,以驗證使用者的身份。

在網站開發中,驗證碼通常會嵌入登入系統中,防止惡意使用者透過暴力破解等方式取得系統權限。同時,驗證碼也可以避免惡意使用者使用自動化程式進行攻擊和刷資料等行為。

  1. 製作 PHP 驗證碼

在 PHP 中,可以使用 GD 擴充功能庫繪製各種驗證碼,包括數字、字母和圖形等。以下我們以數字和字母驗證碼為例,介紹如何在 PHP 中製作驗證碼。

2.1. 數字驗證碼產生

數字驗證碼是製作驗證碼最基本的形式,也是最常見的一種。可以使用 GD 庫中的函數產生數字驗證碼。下面是一段範例程式碼,用於產生一個隨機的4位數字驗證碼。

<?php
session_start(); // 开启 session

header(&#39;Content-type: image/png&#39;); // 设置 Content-type

$im = imagecreatetruecolor(80, 40); // 创建一个宽为80,高为40的验证码背景图
$bgColor = imagecolorallocate($im, 255, 255, 255); // 设置背景色为白色
imagefill($im, 0, 0, $bgColor); // 绘制背景

$code = rand(1000, 9999); // 随机生成一个 4 位数的验证码
$_SESSION[&#39;code&#39;] = $code; // 把验证码存储在 Session 中,以便在其他页面中使用

$textColor = imagecolorallocate($im, 0, 0, 0); // 设置验证码颜色

imagestring($im, 5, 20, 12, $code, $textColor); // 绘制验证码

imagepng($im); // 输出 PNG 图片
imagedestroy($im); // 释放内存
?>
登入後複製

解析:

  • 首先,我們開啟了 PHP 的 session 功能,以便在其他頁面上使用驗證碼。
  • 然後,我們指定驗證碼的 MIME 類型為 image/png,告訴瀏覽器該檔案是一個 PNG 圖片檔。
  • 接著,我們使用 imagecreatetruecolor 函數建立一個寬為80,高為40的空圖像。
  • 然後,我們使用 imagecolorallocate 函數設定了白色的背景,並使用 imagefill 函數填入整個影像。
  • 隨後,我們產生一個隨機的4位數驗證碼,並將其儲存在 session 中。
  • 最後,我們使用 imagestring 函數在圖像中繪製了驗證碼,並使用 imagepng 函數輸出生成的 PNG 圖片,然後銷毀圖像資源,釋放記憶體。

2.2. 字母數字混合驗證碼產生

數字驗證碼容易受到攻擊,所以為了提高安全性,我們可以使用字母數字混合的驗證碼形式。同樣地,我們可以使用 PHP 的 GD 函式庫繪製字母數字驗證碼。以下是一段範例程式碼,用於產生一個隨機的4位字母數字混合驗證碼。

<?php
session_start(); // 开启 session

header(&#39;Content-type: image/png&#39;); // 设置 Content-type

$im = imagecreatetruecolor(100, 40); // 创建一个宽为100,高为40的验证码背景图
$bgColor = imagecolorallocate($im, 255, 255, 255); // 设置背景色为白色
imagefill($im, 0, 0, $bgColor); // 绘制背景

// 字母数字集
$chars = &#39;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&#39;;
$len = strlen($chars);
$code = &#39;&#39;;
for ($i = 0; $i < 4; $i++) {
    $code .= $chars[rand(0, $len-1)];
}

$_SESSION[&#39;code&#39;] = $code; // 把验证码存储在 Session 中,以便在其他页面中使用

$textColor = imagecolorallocate($im, 0, 0, 0); // 设置验证码颜色

// 使用随机字体和位置,绘制验证码
for ($i = 0; $i < 4; $i++) {
    $font = rand(1, 5); // 随机选择字体
    $angle = rand(-20, 20); // 随机旋转角度
    $x = $i * 20 + rand(0, 10); // 规定较小的x坐标值和x步进值,y的值也可以自定义 
    $y = rand(20, 30);
    $fontColor = imagecolorallocate($im, rand(0, 255), rand(0, 255), rand(0, 255));
    $char = substr($code, $i, 1);
    imagettftext($im, 18, $angle, $x, $y, $fontColor, __DIR__.&#39;/font&#39;.$font.&#39;.ttf&#39;, $char);
}

imagepng($im); // 输出 PNG 图片
imagedestroy($im); // 释放内存
?>
登入後複製

解析:

  • 與數字驗證碼的生成方式不同,字母數字混合驗證碼需要先定義一個由數字和字母組成的集合chars,然後從中隨機獲取字符。
  • 然後,我們使用相同的方式將驗證碼儲存在 session 中。
  • 字元的繪製與數字驗證碼基本上相同,但需要引入 ttf 字體檔案來產生字母。我們隨機選擇一個字體和繪製位置,並使用 imagettftext 函數繪製字元。
  1. 在網站中使用驗證碼

產生驗證碼之後,只需要在使用者登入頁面中引入產生驗證碼的程式。在驗證使用者輸入帳號和密碼資訊的同時,也需要驗證使用者輸入的驗證碼是否正確。

下面是一個使用者登入頁面的範例程式碼。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <form action="login.php" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username"><br>

        <label for="password">Password:</label>
        <input type="password" id="password" name="password"><br>

        <label for="code">Code:</label>
        <input type="text" id="code" name="code"><br>
        <img src="captcha.php" alt="Captcha">

        <button type="submit">Submit</button>
    </form>
</body>
</html>
登入後複製

與普通的使用者登入頁面類似,我們在輸入帳號和密碼的同時新增了驗證碼部分,並引入驗證碼的產生程式 captcha.php。使用者輸入帳號、密碼和驗證碼後,點選提交按鈕,系統將提交使用者輸入的資訊到 login.php 中進行驗證。

以下是 login.php 中的程式碼,用來驗證使用者輸入的帳號、密碼和驗證碼資訊是否正確。

<?php
session_start();

$username = $_POST[&#39;username&#39;];
$password = $_POST[&#39;password&#39;];
$code = $_POST[&#39;code&#39;];

// 验证用户输入的验证码是否正确
if (strtolower($code) !== strtolower($_SESSION[&#39;code&#39;])) {
    echo &#39;Invalid Code.&#39;;
    exit;
}

// 验证用户输入的账号和密码是否正确
if ($username === &#39;admin&#39; && $password === &#39;admin&#39;) {
    echo &#39;Login Successfully.&#39;;
} else {
    echo &#39;Invalid Username or Password.&#39;;
}
?>
登入後複製

在 login.php 中,我們先驗證使用者輸入的驗證碼是否正確。如果驗證碼不匹配,則提示使用者輸入的驗證碼無效,退出登入驗證。否則,我們驗證使用者輸入的帳號和密碼資訊是否正確。如果正確,提示使用者登入成功,否則提示使用者名稱或密碼無效。

  1. 總結

本篇文章介紹如何使用PHP 和GD 庫產生數字和字母數字混合驗證碼,並在網站中使用驗證碼來保證使用者登錄資訊的安全性。透過本文的學習,你已經了解如何防止惡意使用者使用自動化程式攻擊你的網站,並保護了網站使用者的帳號和個人隱私安全。

以上是如何使用PHP實作使用者登入驗證碼功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板