php 接收 base64 文件时,先限制请求体大小,再用 base64_decode($value, true) 严格解码。下面的本地示例只接收不超过 1 mib 的 png,并用服务端生成的文件名写到网页根目录之外。
限制 JSON 请求体并校验解码大小
将以下片段保存到 public/upload.php。示例只绑定本机,要求启用 Fileinfo;接入正式应用时还需鉴权、限流和服务端请求体上限。
<?php
header('Content-Type: application/json');
function failUpload(int $status, string $message): void
{
http_response_code($status);
echo json_encode(['error' => $message]);
exit;
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Allow: POST');
failUpload(405, 'Use POST');
}
$body = file_get_contents('php://input', false, null, 0, 1500001);
if ($body === false || strlen($body) > 1500000) {
failUpload(413, 'Request too large');
}
$data = json_decode($body, true);
$value = $data['base64'] ?? null;
if (!is_string($value) || $value === '') {
failUpload(400, 'Missing base64');
}
$bytes = base64_decode($value, true);
if ($bytes === false || $bytes === '') {
failUpload(400, 'Invalid base64');
}
if (strlen($bytes) > 1048576) {
failUpload(413, 'Decoded file too large');
}
客户端传纯 Base64 字符串。带 data URL 前缀的内容需要先按接口约定解析。
检查 MIME 并生成服务端文件名
把下面代码接在同一文件末尾。在项目根目录创建可写的 uploads,确保它位于 public 外面。
立即学习“PHP免费学习笔记(深入)”;
$mime = (new finfo(FILEINFO_MIME_TYPE))->buffer($bytes);
if ($mime !== 'image/png') {
failUpload(415, 'PNG required');
}
$dir = dirname(__DIR__) . '/uploads';
$name = bin2hex(random_bytes(16)) . '.png';
$path = $dir . '/' . $name;
if (file_put_contents($path, $bytes, LOCK_EX) !== strlen($bytes)) {
if (is_file($path)) {
unlink($path);
}
failUpload(500, 'Storage failed');
}
http_response_code(201);
echo json_encode(['file' => $name]);文件类型探测只能识别内容特征。若应用要公开展示用户图片,应再按业务要求验证、解码或重编码。
验证有效图片和非法输入
在项目根启动 php -S 127.0.0.1:8000 -t public。另开终端发送请求。第一条命令要求本地存在 sample.png。
php -r 'echo json_encode(["base64" => base64_encode(file_get_contents("sample.png"))]);' |
curl -i -H 'Content-Type: application/json' --data-binary @- http://127.0.0.1:8000/upload.php
curl -i -H 'Content-Type: application/json' --data '{"base64":"@@@"}' \
http://127.0.0.1:8000/upload.php有效文件应得到 201,非法 Base64 应得到 400。检查 uploads 中只有有效请求生成的文件。



















