PHP is_uploaded_file 函数
最后修改于 2025 年 4 月 3 日
PHP `is_uploaded_file` 函数用于检查文件是否是通过 HTTP POST 上传的。在 PHP 中处理文件上传时,这是一个关键的安全措施。
基本定义
`is_uploaded_file` 函数会验证文件是否存在并且是通过 HTTP POST 上传的。它有助于防止文件上传中的安全漏洞。
语法: `is_uploaded_file(string $filename): bool`。如果文件存在并且是通过 POST 上传的,则返回 true,否则返回 false。
基本文件上传验证
此示例使用 `is_uploaded_file` 来演示基本的文件上传验证。
basic_upload.php
<?php declare(strict_types=1); if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['userfile'])) { $tmpName = $_FILES['userfile']['tmp_name']; if (is_uploaded_file($tmpName)) { echo "File was uploaded via HTTP POST."; } else { echo "Potential file upload attack!"; } }
这会检查临时文件是否真的通过 POST 上传。在移动上传的文件之前,请务必使用此函数,以防止安全问题。
安全文件上传处理
本示例演示了一个完整的文件上传安全处理过程,包含验证。
secure_upload.php
<?php declare(strict_types=1); if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['document'])) { $uploadDir = __DIR__ . '/uploads/'; $tmpName = $_FILES['document']['tmp_name']; $targetPath = $uploadDir . basename($_FILES['document']['name']); if (!is_uploaded_file($tmpName)) { die("Invalid file upload detected."); } if (move_uploaded_file($tmpName, $targetPath)) { echo "File uploaded successfully."; } else { echo "File upload failed."; } }
这将 `is_uploaded_file` 与 `move_uploaded_file` 结合使用以进行安全处理。在将文件移动到其目标位置之前,请务必验证文件。
多个文件上传验证
此示例展示了如何一次性验证多个上传的文件。
multi_upload.php
<?php declare(strict_types=1); if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_FILES['photos'])) { foreach ($_FILES['photos']['tmp_name'] as $key => $tmpName) { if (!is_uploaded_file($tmpName)) { echo "File {$key} failed validation."; continue; } // Process valid files here echo "File {$key} is valid."; } }
处理多个文件时,请单独验证每个文件。这可以防止恶意文件与合法文件一起被处理。
文件类型限制
将 `is_uploaded_file` 与文件类型检查结合使用以增强安全性。
type_check.php
<?php declare(strict_types=1); $allowedTypes = ['image/jpeg', 'image/png']; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['avatar'])) { $tmpName = $_FILES['avatar']['tmp_name']; $fileType = $_FILES['avatar']['type']; if (!is_uploaded_file($tmpName)) { die("Invalid file upload."); } if (!in_array($fileType, $allowedTypes, true)) { die("Only JPEG and PNG images are allowed."); } // Process the valid image echo "Image uploaded successfully."; }
此检查会验证上传的有效性和文件类型。在检查允许的类型时,请务必使用严格比较,以防止类型混淆问题。
高级安全检查
此示例演示了全面的上传安全检查。
advanced_check.php
<?php declare(strict_types=1); function isSafeUpload(array $file): bool { if (!isset($file['tmp_name'], $file['error'])) { return false; } if ($file['error'] !== UPLOAD_ERR_OK) { return false; } if (!is_uploaded_file($file['tmp_name'])) { return false; } // Additional checks can be added here return true; } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['resume'])) { if (isSafeUpload($_FILES['resume'])) { echo "File passed all security checks."; } else { echo "File upload rejected by security checks."; } }
这会将多个安全检查合并到一个验证函数中。它会验证上传错误代码以及上传方法,以实现全面的保护。
最佳实践
- 始终验证:在没有验证的情况下,切勿信任用户上传的文件。
- 与 move_uploaded_file 一起使用:结合使用此函数以提高安全性。
- 检查错误代码:在验证之前,请检查 UPLOAD_ERR_OK。
- 限制文件大小:将 $_FILES['file']['size'] 与限制进行比较。
- 清理名称:在存储之前清理文件名。
常见错误
- 跳过验证:根本不使用 is_uploaded_file。
- 信任文件名:直接使用 $_FILES['file']['name']。
- 无大小检查:允许过大的文件。
- 不安全的存储:将上传的文件放置在 Web 可访问的位置。
来源
本教程涵盖了 PHP `is_uploaded_file` 函数,并提供了实际示例,演示了 PHP 中安全的文件上传验证。
作者
列出 所有 PHP 文件系统函数。