首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 產生隨機字串函式:可自訂長度與字元集

     編輯:PHP 綜合知識

常用於產生臨時密碼、API Token、驗證碼、檔名鹽值等場景。以下封裝為可重複使用的函式,支援自訂長度與字元集。

基礎版 (排除易混淆字元)

<?php
/**
 * 產生隨機字串
 * @param int $length 字串長度,預設 6
 * @param string $charset 字元集,預設排除 0/O, 1/I/l 等易混淆字元
 * @return string
 */
function randStr(int $length = 6, string $charset = ''): string {
    if ($charset === '') {
        // 預設字元集:大小寫字母(去除易混淆) + 數字(去除0,1) + 符號
        $charset = 'ABDEFGHJKLMNPQRSTVWXYabdefghijkmnpqrstvwxy23456789#%*';
    }
    $maxIdx = strlen($charset) - 1;
    $result = '';
    for ($i = 0; $i < $length; $i++) {
        $result .= $charset[mt_rand(0, $maxIdx)];
    }
    return $result;
}

// 使用範例
echo randStr();        // 6 碼預設字元集
echo randStr(10);      // 10 碼
echo randStr(32, '0123456789abcdef'); // 32 碼十六進位
?>

加密安全版 (PHP 7+ random_bytes)

若需密碼學安全隨機性 (如 Session ID、加密金鑰、重設密碼 Token),請改用 random_bytes() + Base64/HEX 編碼:

<?php
function randStrSecure(int $bytes = 16, string $encoding = 'base64url'): string {
    $bytes = random_bytes($bytes);
    return match ($encoding) {
        'hex'       => bin2hex($bytes),
        'base64'    => base64_encode($bytes),
        'base64url' => rtrim(strtr(base64_encode($bytes), '+/', '-_'), '='),
        default     => throw new InvalidArgumentException('Unsupported encoding'),
    };
}

// 範例:產生 32 位元組 (256 bits) URL-safe Base64 Token
$token = randStrSecure(32); // 約 43 字元
?>

選擇指南

場景推薦函式理由
一般唯一代碼、檔名、顯示用 TokenrandStr() (mt_rand)速度快、字元集可控、可讀性佳
Session ID、CSRF Token、密碼重設連結、API 金鑰randStrSecure() (random_bytes)密碼學安全、不可預測、防暴力破解
舊版 PHP (< 7.0) 需安全隨機openssl_random_pseudo_bytes()相容舊版,需檢查 $crypto_strong

常見陷阱

  • 不要用 rand() 或 mt_rand() 產生安全敏感值:兩者皆為偽隨機,種子可預測。
  • 不要用 time()、microtime()、uniqid() 作為 Token:熵極低,極易衝突與猜測。
  • 字元集若包含特殊符號,確認下游系統 (URL、SQL、Shell、JSON) 是否需轉義。

依用途選對函式,兼顧安全與可用性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved