美文网首页工作生活
用 PHP 生成驗證碼的辦法及範例

用 PHP 生成驗證碼的辦法及範例

作者: 麥丹慈 | 来源:发表于2019-06-29 17:54 被阅读0次

辦法

若不考慮援用第三方拓展,則參見圖像生成與處理的說明以選取適當的函式庫來完成即可。其中以借用 Graphics Draw 的實現爲經典,但使用時仍需注意 PHP、GD 及相關組件的版次。

在 Windows 上要使用 GD 庫,須依次序載入以下三個以動態鏈接庫形態存在的擴展:

  • php_mbstring.dll
  • php_exif.dll
  • php_gd2.dll(第二版,其支援 imagecreatetruecolor 函式,而第一版 php_gd.dll 中不支援)

另外 php.ini 中亦需注意 memory_limit 設定是否恰當。

範例

需求

利用 GD 生成隨機驗證碼:建立一尺寸爲 120 * 25 px^2 的畫布並在其上散佈 50 個綠色的隨機干擾畫素點,且驗證碼有且僅有 5 個字符,字符僅能由大寫英文字母同阿拉伯數字組成,且各字符之色彩可不同。

分析

每次生成驗證碼都要完成的確定的步驟:

  1. 建立指定尺寸的畫布;
  2. 散佈干擾畫素;
    每次生成都要完成但可配置的步驟:指定具體生成的驗證碼,可考慮作爲參數傳入。

範例原始碼

<?php
const
X = 0,
Y = 1,
WIDTH = 0,
HEIGHT = 1;

function random_colour_val()
{
    return mt_rand(0, 127);
}

/**
 * Generate verification code image.
 * @param $code array Verification code
 */
function img_code_verif_gen($code = 0, $charCount = 5)
{
    // Code process
    if (is_string($code)) {
        if (mb_strlen($code) != $charCount) {
            throw new Exception('Code string length is not equal to character count ' . $charCount);
        }
    } elseif (is_numeric($code)) {
        $code = str_pad($code, $charCount, '0', STR_PAD_LEFT);
    }

    // Initialize the image handle
    $imgSize = [
        WIDTH => 120,
        HEIGHT => 25,
    ];
    $img = imagecreate($imgSize[WIDTH], $imgSize[HEIGHT]);

    imagecolorallocate($img, 255, 255, 255); // The first colour in the image is as backound colour. White.
    $colourDot = imagecolorallocate($img, 63, 255, 63); // Green

    // 散佈干擾畫素,或會重複
    for ($i = 0; $i < 50; $i++) {
        imagesetpixel($img, mt_rand(0, $imgSize[WIDTH] - 1), mt_rand(0, $imgSize[HEIGHT] - 1), $colourDot);
    }

    // Set characters
    for ($i = 0; $i < $charCount; $i++) {
        // Using random location
        $location = [
            X => mt_rand(0, 8) + ($imgSize[WIDTH] / $charCount) * $i,
            Y => mt_rand(0, $imgSize[HEIGHT] / 3),
        ];

        $colourChar = imagecolorallocate($img, random_colour_val(), random_colour_val(), random_colour_val()); // Set random colour within dark colour set

        imagestring($img, 4, $location[X], $location[Y], $code[$i], $colourChar); // Insert characters
    }

    // Output directly
    header('content-type: image/png');
    imagepng($img);
    imagedestroy($img);
}

function main()
{
    $charCount = 5;
    $charSet = array_merge(range(0, 9), range('A', 'Z'));
    $charOffsetMax = count($charSet) - 1;

    $code = [];
    for ($i = 0; $i < $charCount; $i++) {
        $code[$i] = $charSet[mt_rand(0, $charOffsetMax)];
    }

    img_code_verif_gen($code, $charCount); // Build the code
}

main();

執行

利用 PHP 內建之 web 伺服器 php -S 即可體驗。

相关文章

  • 用 PHP 生成驗證碼的辦法及範例

    辦法 若不考慮援用第三方拓展,則參見圖像生成與處理的說明以選取適當的函式庫來完成即可。其中以借用 Graphics...

  • PIL庫(中文驗證碼生成)

    公司要求做一個途牛網的驗證碼識別,需要用深度學習,為了生成對應網站驗證碼的訓練集,我網上搜了一些資料學習了一下,過...

  • 2019-06-14 Google reCAPTCHA v3 的

    一般設計使用者登入的驗證碼,不外乎是填寫英文數字與後端的 SESSION 是否符合,如果是符合就可以登入,而驗證碼...

  • 寫法整理

    日常編寫代碼時的一些寫法整理,作爲參考使用,不定期更新,盡量讓自己的代碼統一、規範。 HTML 屬性順序 clas...

  • 出租車上的簡書日更挑戰

    30天的日更,都是在出租車20多分鐘裡完成的。剛開始是想鍛鍊自己在「限時壓力」下的碼字能力,還有驗證賴聲川導演說:...

  • 旅居北美日記(壹玖零)

    2022年7月15日 星期五 多雲 Burnaby 下午去了麗晶廣場,簽了合同交了簽證辦理費用就坐等簽證了。...

  • google workspace send mail

    SMTP 透過SMTP用程式寄google workspace郵件 使用者登入並開兩步驗證Screen Shot ...

  • 商戶後台使用幫助(中文版)-網頁 2.0版

    一、什麼是海玩商戶後台?為什麼要用? 目前是海玩提供給商戶進行海玩電子碼驗證、訂單確認/查詢的管理後台。之後還會提...

  • 商戶後台使用幫助(中文版)-APP 2.0版

    一、什麼是海玩商戶後台?為什麼要用? 目前是海玩提供給商戶進行海玩電子碼驗證、訂單確認/查詢的管理後台。之後還會提...

  • 断桥呼渡~

    人生遇到困難要及時尋求解决的辦法

网友评论

    本文标题:用 PHP 生成驗證碼的辦法及範例

    本文链接:https://www.haomeiwen.com/subject/panpcctx.html