首頁 > 後端開發 > php教程 > phpmaster |使用PHP上傳文件

phpmaster |使用PHP上傳文件

William Shakespeare
發布: 2025-03-03 08:28:10
原創
619 人瀏覽過

phpmaster | Uploading Files with PHP

PHP 文件上傳:構建安全可靠的上傳系統

在線相冊圖片、郵件附件以及批量處理應用的數據文件,它們有一個共同點:都需要通過用戶的網頁瀏覽器將文件上傳到互聯網。文件上傳功能是許多日常使用的網站和網絡應用程序的重要組成部分。本文將向您展示如何使用 PHP 為您的網站添加文件上傳支持。

關鍵要點

  • 在 PHP 中添加文件上傳支持需要創建一個供用戶使用的 HTML 表單和一個用於處理服務器上上傳文件的 PHP 腳本。 <form></form> 元素必須使用 POST 方法,並將 enctype 屬性設置為 multipart/form-data。
  • 上傳的文件首先存儲在臨時目錄中。負責處理表單提交的 PHP 腳本會驗證文件並進行處理,通常會將其從臨時位置移動到更永久的位置。
  • 有關文件上傳的信息通過多維數組 $_FILES 提供。 move_uploaded_file() 函數將上傳的文件從臨時位置移動到永久位置,並執行額外的檢查以確保文件確實是通過 HTTP POST 請求上傳的。
  • 允許文件上傳存在安全風險。為了減輕這些風險,可以驗證上傳文件的類型,對上傳流量施加嚴格限制,並掃描病毒。通過用下劃線替換任何非字母、數字或一組非常有限的標點符號的字符,確保安全的文件名也很重要。

先決條件

處理文件上傳並不困難,但是有一些小的細節必須正確,否則上傳將會失敗。首先,您需要確保 PHP 配置為允許上傳。檢查您的 php.ini 文件並驗證 file_uploads 指令是否設置為 On。

<code>file_uploads = On</code>
登入後複製
登入後複製
登入後複製
登入後複製

上傳的文件首先存儲在臨時目錄中(別擔心……您的 PHP 腳本之後可以將文件移動到更永久的位置)。默認情況下,初始位置是系統的默認臨時目錄。您可以使用 php.ini 中的 upload_tmp_dir 指令指定不同的目錄。無論如何,您應該驗證 PHP 進程是否具有寫入所用目錄的適當權限。

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>
登入後複製
登入後複製
登入後複製

確定配置允許服務器接受上傳的文件後,您可以將注意力集中在 HTML 細節上。與大多數來自 HTML 的其他服務器端交互一樣,上傳文件使用表單。您的 <form></form> 元素必須使用 POST 方法並將 enctype 屬性設置為 multipart/form-data,這一點非常重要。

登入後複製
登入後複製

編寫上傳過程腳本

根據您自己的經驗和剛才提到的要求檢查,您可能已經猜到了文件上傳的流程。

  • 訪問者查看包含專門用於支持文件上傳的表單的 HTML 頁面。
  • 訪問者提供他想要上傳的文件並提交表單。
  • 瀏覽器對文件進行編碼,並將其作為對服務器發出的 POST 請求的一部分發送。
  • PHP 接收表單提交,解碼文件並將其保存在服務器上的臨時位置。
  • 負責處理表單提交的 PHP 腳本驗證文件並以某種方式處理它,通常將其從臨時位置移動到更永久的位置。

添加文件上傳支持需要您創建一個要呈現給用戶的 HTML 表單和一個用於處理服務器上上傳文件的 PHP 腳本。

HTML

HTML 表單提供用戶啟動文件上傳的界面。請記住,<input> 元素的 method 屬性必須設置為 post,enctype 屬性必須設置為 multipart/form-data。一個文件 <input> 元素提供一個用於指定將要上傳的文件的字段。像任何其他表單元素一樣,提供 name 屬性非常重要,以便您可以在處理表單的 PHP 腳本中引用它。以下是基本文件上傳表單的標記示例:

<code>file_uploads = On</code>
登入後複製
登入後複製
登入後複製
登入後複製

值得注意的是,不同的瀏覽器會以不同的方式呈現文件字段。 IE、Firefox 和 Opera 將其顯示為帶有旁邊標記為“瀏覽”或“選擇”的按鈕的文本字段。 Safari 將其呈現為僅標記為“選擇文件”的按鈕。這通常不是問題,因為用戶習慣了該字段在其選擇的瀏覽器中的呈現方式,並且知道如何使用它。但是,有時您會遇到堅持以某種方式呈現它的客戶端或設計師。由於瀏覽器施加的安全原因,可以應用於文件字段的 CSS 和 JavaScript 的數量非常有限。樣式化文件字段可能很困難。如果外觀對您很重要,我建議您查看 Peter-Paul Koch 的《樣式化 input type="file"》。

PHP

有關文件上傳的信息通過多維數組 $_FILES 提供。此數組按分配給 HTML 表單中文件字段的名稱進行索引,就像 $_GET$_POST 按名稱進行索引一樣。然後,每個文件的數組包含以下索引:

  • $_FILES["myFile"]["name"] 存儲來自客戶端的原始文件名。
  • $_FILES["myFile"]["type"] 存儲文件的 MIME 類型。
  • $_FILES["myFile"]["size"] 存儲文件的大小(以字節為單位)。
  • $_FILES["myFile"]["tmp_name"] 存儲臨時文件的名稱。
  • $_FILES["myFile"]["error"] 存儲傳輸過程中產生的任何錯誤代碼。

move_uploaded_file() 函數將上傳的文件從臨時位置移動到永久位置。您應該始終為此目的使用 move_uploaded_file() 而不是 copy()rename() 等函數,因為它會執行額外的檢查以確保文件確實是通過 HTTP POST 請求上傳的。如果您計劃使用用戶提供的原始文件名保存文件,最好確保這樣做是安全的。文件名不應包含任何可能影響目標路徑的字符,例如斜杠。名稱也不應該導致文件覆蓋同名的現有文件(除非您的應用程序設計就是這麼做的)。我通過用下劃線替換任何非字母、數字或一組非常有限的標點符號的字符,然後在同名文件已存在時附加遞增的數字來確保安全的文件名。以下是接收和處理 PHP 文件上傳的示例:

<code>file_uploads = On</code>
登入後複製
登入後複製
登入後複製
登入後複製

這段代碼首先確保文件上傳沒有錯誤。然後,它確定安全的文件名(如我剛才所述),然後使用 move_uploaded_file() 將文件移動到其最終目錄。最後,調用 chmod() 以確保在新文件上設置了合理的訪問權限。

安全注意事項

我們大多數人都不會讓完全陌生的人在我們的個人電腦上存儲隨機文件,但當您允許在我們的應用程序中上傳文件時,您實際上就是在做這件事。您可能打算讓用戶上傳自己的照片作為個人資料頁面,但如果他試圖上傳特別製作的、帶有病毒的可執行文件怎麼辦?我想分享一些您可以採取的步驟,以最大限度地減少允許文件上傳固有的安全風險。其中一個步驟是驗證上傳文件的類型是否正確。依賴 $_FILES["myFile"]["type"] 的值或文件名的擴展名是不安全的,因為兩者都容易被偽造。相反,使用 exif_imagetype() 等函數檢查文件的內容並確定它是否確實是 GIF、JPEG 或其他幾種受支持的圖像格式。如果 exif_imagetype() 不可用(該函數需要啟用 Exif 擴展),則可以使用 getimagesize()getimagesize() 返回的數組將包含圖像類型(如果識別)。

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>
登入後複製
登入後複製
登入後複製

對於非圖像文件,您可以使用 exec() 來調用 unix file 實用程序。 file 通過查找預期位置中的已知二進制簽名來確定文件的類型。

<code>file_uploads = On</code>
登入後複製
登入後複製
登入後複製
登入後複製

您可以採取的另一個步驟是對 POST 請求的總大小和可以上傳的文件數量施加嚴格限制。為此,請在 php.ini 中為 upload_max_size、post_max_size 和 max_file_uploads 指令指定適當的值。 upload_max_size 指令指定文件上傳的最大大小。除了上傳的大小之外,您還可以使用 post_max_size 指令限制整個 POST 請求的大小。 max_file_uploads 是一個較新的指令(在 5.2.12 版本中添加),它限制了文件上傳的數量。這三個指令有助於保護您的網站免受試圖通過造成大量網絡流量或系統負載來破壞其可用性的攻擊。

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>
登入後複製
登入後複製
登入後複製

您可以採取的第三個步驟是用病毒掃描程序掃描上傳的文件。在當今病毒和惡意軟件廣泛傳播的時代,這至關重要,尤其是在您的網站稍後允許其他個人下載上傳的文件時,例如在基於 Web 的電子郵件客戶端或(合法)文件共享網站中的附件。有一個 PHP 擴展程序可以訪問 ClamAV,但是,當然,您可以像我為 file 演示的那樣調用 ClamAV 的命令行實用程序。

登入後複製
登入後複製

總結

您已經了解了使用您的網站或基於 Web 的應用程序支持文件上傳是多麼容易。為了使上傳成功,HTML 表單必須通過 multipart/form-data 編碼的 POST 請求提交,並且 PHP 必須允許使用 file_uploads 指令指定的傳輸。文件傳輸後,負責處理上傳的腳本使用在 $_FILES 數組中找到的信息將文件從臨時目錄移動到所需位置。我還分享了一些額外的預防措施,您可以採取這些措施來保護您自己和您的用戶免受與允許文件上傳相關的一些風險。您看到瞭如何確保文件名安全、驗證文件類型、對上傳流量施加嚴格限制以及掃描病毒。

(後續內容,例如常見問題解答部分,可以根據需要添加)

以上是phpmaster |使用PHP上傳文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板