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

PHP 目錄名稱合法性檢測函數

     編輯:PHP 相關知識

PHP 目錄/檔案名稱合法字元驗證

檢測字串是否僅包含合法的目錄名稱字元:英數字、底線、連字號、點號。適用於使用者輸入的目錄名稱驗證。

原始函數分析與修正

原始碼有語法錯誤(`for` 迴圈條件不完整、`nerror` 未定義),以下是修正並加強的版本:

修正版函數

<?php
/**
 * 檢測目錄名稱合法性
 * @param string $str 待檢測字串
 * @param bool $strict 嚴格模式:true=僅允許英數字底線連字號點,false=允許中文等
 * @return string|false 合法時回傳原字串,不合法回傳 false
 */
function isValidDirName($str, $strict = true) {
    if (!is_string($str) || $str === '') return false;

    $len = strlen($str);
    for ($i = 0; $i < $len; $i++) {
        $p = ord($str[$i]);

        if ($strict) {
            // 僅允許:0-9 (48-57)、A-Z (65-90)、a-z (97-122)、_ (95)、- (45)、. (46)
            if (($p < 48 || $p > 57) && ($p < 65 || $p > 90) && ($p < 97 || $p > 122)
                && $p !== 95 && $p !== 45 && $p !== 46) {
                return false;
            }
        } else {
            // 寬鬆模式:排除控制字元、斜線、冒號、星號、問號、引號、小於大於、縱線
            if ($p < 32 || $p === 47 || $p === 58 || $p === 42 || $p === 63
                || $p === 34 || $p === 60 || $p === 62 || $p === 124) {
                return false;
            }
        }
    }

    // 額外檢查:不可為 . 或 ..
    if ($str === '.' || $str === '..') return false;

    // 禁止以點開頭(隱藏目錄),視需求決定
    // if ($str[0] === '.') return false;

    return $str;
}

// 使用範例
var_dump(isValidDirName('valid_name-123')); // true
var_dump(isValidDirName('invalid/name'));   // false
var_dump(isValidDirName(''));               // false
var_dump(isValidDirName('.'));              // false
?>

正則表達式版(更簡潔)

function isValidDirNameRegex($str, $strict = true) {
    if (!is_string($str) || $str === '') return false;
    if ($str === '.' || $str === '..') return false;

    $pattern = $strict
        ? '/^[a-zA-Z0-9_.-]+$/'           // 嚴格:英數字 _ - .
        : '/^[^\\x00-\\x1F\\/:*?"<>|]+$/'; // 寬鬆:排除控制字元與 Windows 非法字元

    return (bool)preg_match($pattern, $str) ? $str : false;
}

跨平台非法字元對照

作業系統禁止字元保留名稱
Windows\ / : * ? " < > | 及控制字元 (0-31)CON, PRN, AUX, NUL, COM1-9, LPT1-9
Linux/Unix/ 及 null 字元無(區分大小寫)
macOS (APFS)/ : 及控制字元無

最佳實務建議

  • 使用白名單驗證(允許字元)而非黑名單
  • 結合 `basename()` 防止路徑遍歷
  • 實際建立目錄前用 `is_dir()`、`mkdir()` 搭配錯誤處理
  • 考慮長度限制(如 255 位元組)
  • Unicode 正規化:`Normalizer::normalize($str, Normalizer::FORM_C)`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved