is_uploaded_file

(PHP 3 >= 3.0.17, PHP 4 >= 4.0.3, PHP 5)

is_uploaded_file -- 判斷檔案是否是通過 HTTP POST 上傳的

說明

bool is_uploaded_file ( string filename )

若果 filename 所給出的檔案是通過 HTTP POST 上傳的則返回 TRUE。這可以用來確保惡意的會員無法欺騙腳本去訪問本不能訪問的檔案,例如 /etc/passwd

這種檢查顯得格外重要,若果上傳的檔案有可能會造成對會員或本系統的其他會員顯示其內容的話。

為了能使 is_uploaded_file() 函數標準工作,必段指定類似於 $_FILES['userfile']['tmp_name'] 的變量,而在從用戶端上傳的檔案名 $_FILES['userfile']['name'] 不能標準運作。

例子 1. is_uploaded_file() 例子

<?php

if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
   echo 
"File "$_FILES['userfile']['name'] ." uploaded successfully.\n";
   echo 
"Displaying contents\n";
   
readfile($_FILES['userfile']['tmp_name']);
} else {
   echo 
"Possible file upload attack: ";
   echo 
"filename '"$_FILES['userfile']['tmp_name'] . "'.";
}

?>

is_uploaded_file() 僅可用於 PHP 3 的 3.0.16 版之後,以及 PHP 4 的 4.0.2 版之後。若果執意要用老版本,可以用下面的函數來保護自己:

注: 以下例子不能用於 PHP 4 的 4.0.2 版之後。它依賴的 PHP 內定函數在該版本之後改變了。

例子 2. is_uploaded_file() 可運行於 PHP 4 < 4.0.3 的例子

<?php
/* Userland test for uploaded file. */
function is_uploaded_file($filename)
{
    if (!
$tmp_file get_cfg_var('upload_tmp_dir')) {
        
$tmp_file dirname(tempnam(''''));
    }
    
$tmp_file .= '/' basename($filename);
    
/* User might have trailing slash in php.ini... */
    
return (ereg_replace('/+''/'$tmp_file) == $filename);
}

/* This is how to use it, since you also don't have
 * move_uploaded_file() in these older versions: */
if (is_uploaded_file($HTTP_POST_FILES['userfile'])) {
    
copy($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file");
} else {
    echo 
"Possible file upload attack: filename '$HTTP_POST_FILES[userfile]'.";
}
?>

參見 move_uploaded_file(),以及檔案上傳處理一章中的簡單使用例子。