當前位置: 首頁> 最新文章列表> 如何使用md5_file 函數在PHP 中校驗文件上傳的合法性?

如何使用md5_file 函數在PHP 中校驗文件上傳的合法性?

gitbox 2025-08-23
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 這部分代碼與文章內容無關,僅作示例展示</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"歡迎閱讀本文!"</span></span><span>;
</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-comment"># 如何使用 md5_file 函數在 PHP 中校驗文件上傳的合法性?</span></span><span>

在網站開發中,文件上傳功能是一個非常常見的需求。然而,為了保障安全性,開發者需要對上傳的文件進行校驗,防止惡意文件上傳帶來的風險。PHP 提供了多種文件校驗手段,其中 `md5_file` 函數因其簡單高效,常用於驗證文件完整性和合法性。

</span><span><span class="hljs-comment">## 什麼是 md5_file 函數?</span></span><span>

`md5_file` 是 PHP 内置的函數,用於計算指定文件的 MD5 散列值。MD5 是一種廣泛使用的哈希算法,可以將任意長度的數據映射成一個固定長度的字符串(</span><span><span class="hljs-number">32</span></span><span>個十六進製字符),常用於校驗文件完整性。

函數原型如下:

```php
</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-title function_ invoke__">md5_file</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$binary</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>)
</span></span>
  • $filename :需要計算哈希值的文件路徑

  • $binary (可選):是否以二進制形式返回結果,默認返回16進製字符串

為什麼用md5_file 校驗文件上傳?

在文件上傳時,攻擊者可能上傳惡意代碼或篡改文件。通過計算上傳文件的MD5 值,我們可以:

  • 驗證文件是否在傳輸過程中被篡改或損壞

  • 對比上傳文件的MD5 值和已知安全文件的MD5,判斷文件是否合法

  • 防止重複上傳相同文件(可用於緩存或去重)

實現步驟

  1. 用戶上傳文件後,PHP 會將文件存儲在臨時目錄。

  2. 使用md5_file計算該臨時文件的MD5 值。

  3. 將計算出的MD5 與預先定義的合法文件哈希值列表進行比對。

  4. 如果匹配,說明文件合法;否則拒絕上傳。

示例代碼

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 假設預定義的合法文件MD5值數組</span></span><span>
</span><span><span class="hljs-variable">$allowed_md5_list</span></span><span> = [
    </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>, </span><span><span class="hljs-comment">// 空文件示例</span></span><span>
    </span><span><span class="hljs-string">'5d41402abc4b2a76b9719d911017c592'</span></span><span>, </span><span><span class="hljs-comment">// 示例MD5</span></span><span>
];

</span><span><span class="hljs-comment">// 檢查文件是否上傳成功</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'upload'</span></span><span>]) &amp;&amp; </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'upload'</span></span><span>][</span><span><span class="hljs-string">'error'</span></span><span>] === UPLOAD_ERR_OK) {
    </span><span><span class="hljs-variable">$tmp_file</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'upload'</span></span><span>][</span><span><span class="hljs-string">'tmp_name'</span></span><span>];
    
    </span><span><span class="hljs-comment">// 計算上傳文件的MD5值</span></span><span>
    </span><span><span class="hljs-variable">$file_md5</span></span><span> = </span><span><span class="hljs-title function_ invoke__">md5_file</span></span><span>(</span><span><span class="hljs-variable">$tmp_file</span></span><span>);
    
    </span><span><span class="hljs-comment">// 判斷MD5是否在合法列表中</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$file_md5</span></span><span>, </span><span><span class="hljs-variable">$allowed_md5_list</span></span><span>)) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件上傳合法,MD5校驗通過。"</span></span><span>;
        </span><span><span class="hljs-comment">// 這裡可以執行保存文件等後續操作</span></span><span>
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件上傳不合法,MD5校驗失敗。"</span></span><span>;
        </span><span><span class="hljs-comment">// 這裡可以刪除文件或返回錯誤</span></span><span>
    }
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"沒有檢測到上傳文件或上傳錯誤。"</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

注意事項

  • MD5 已被證明存在碰撞風險,不適合用於密碼等高安全需求的場景。但用作文件完整性校驗,尤其是對比已知文件,仍然有效。

  • 為提高安全性,建議結合文件類型檢測(如MIME 類型)、文件擴展名驗證、文件大小限制等多重校驗措施。

  • 若對安全要求更高,可考慮使用更安全的哈希算法,如SHA-256 ( hash_file('sha256', $filename) )

總結

md5_file函數為PHP 文件上傳安全校驗提供了簡便有效的手段。通過計算上傳文件的MD5 值,並與合法文件哈希值比對,可以有效阻止非法文件上傳,保障網站安全。合理結合其他安全措施,將大幅提昇文件上傳模塊的安全性。

<hr> <?php // 文章結束,附加無關PHP代碼示例echo "感謝您的閱讀!"; ?>
 <span></span>