is_dir()是PHP 內建的函數之一,用於判斷某路徑是否為一個存在的目錄:
<code> $path = '/var/www/html/uploads'; if (is_dir($path)) { echo "這是一個有效的目錄"; } else { echo "該路徑不是目錄或目錄不存在"; } </code>這個函數返回布爾值true或false ,依據的是服務器上的真實文件系統狀態。
在調用is_dir()時盡量使用絕對路徑,相對路徑可能會因為當前工作目錄(CWD)的變化而導致驗證失敗。例如:
<code> $relativePath = 'images'; $absolutePath = __DIR__ . '/images'; if (is_dir($absolutePath)) {
// 推薦方式
}
</code>
realpath()可以將路徑規範化,移除如../等相對路徑成分,同時也可以識別軟鏈接。結合is_dir()使用,可以更有效地進行路徑驗證:
<code> $path = realpath('/var/www/html/uploads'); if ($path !== false && is_dir($path)) { // 確保路徑既存在,又是目錄} </code>當從用戶輸入中獲取路徑時,務必過濾危險字符,如.. ,避免目錄遍歷攻擊。可以結合正則表達式或白名單機制:
<code> $input = $_GET['dir'] ?? ''; if (preg_match('/^[a-zA-Z0-9_\-\/]+$/', $input)) { $path = realpath('/var/www/html/' . $input); if ($path !== false && is_dir($path)) { // 安全訪問} } </code>雖然is_dir()會返回false 對於不存在的路徑,但如果你需要更嚴謹的檢查邏輯,可以先用file_exists()做判斷:
<code> $path = '/var/www/html/uploads'; if (file_exists($path) && is_dir($path)) { // 更加嚴密的驗證} </code>符號鏈接可能導致is_dir()的行為不同於預期。例如,如果一個鏈接指向一個不存在的目錄, is_dir()也會返回false。可以使用is_link()配合使用:
<code> $path = '/var/www/html/uploads'; if (is_link($path)) { echo "這是一個符號鏈接"; } elseif (is_dir($path)) { echo "這是一個真實目錄"; } </code>權限問題:即使目錄存在,如果PHP 沒有讀取權限, is_dir()也可能返回false。
性能問題:頻繁調用is_dir()檢查大量路徑可能造成I/O 壓力,建議緩存已驗證路徑。
多平台兼容性:路徑分隔符在Windows 和Linux 上不同,建議使用DIRECTORY_SEPARATOR或統一使用/ 。
$realBase = realpath($baseDir);
if ($realBase === false || !is_dir($realBase)) {
return $dirs;
}
$entries = scandir($realBase);
foreach ($entries as $entry) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $realBase . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
$dirs[] = $entry;
}
}
return $dirs;
}
$uploadDirs = listUploadDirs('/var/www/gitbox.net/uploads');
print_r($uploadDirs);
</code>
這段代碼安全地列出了指定目錄下的所有子目錄,並考慮了路徑規範化與基礎的安全處理。