如何使用PHP检测上传PDF文件中的JavaScript等威胁?求简单示例
PHP检测上传PDF文件的潜在威胁
快速检测思路
PDF中的恶意内容(如JavaScript、系统命令执行逻辑)往往会包含特定标识关键词,我们可以通过读取PDF文件的文本内容,扫描这些危险关键词来实现快速初步检测。这种方法无需依赖复杂的PDF解析库,简单高效。
实现代码示例
<?php // 检测PDF是否包含危险内容的函数 function isPdfMalicious(string $filePath): bool { // 定义常见的PDF恶意内容关键词 $dangerousKeywords = [ '/JavaScript', '/JS', 'launch', 'OpenAction', '/URI', '/SubmitForm', 'exec', 'system', 'shell_exec' ]; // 读取文件内容(大文件可改用分段读取,避免内存溢出) $pdfContent = file_get_contents($filePath); if ($pdfContent === false) { return true; // 读取失败时默认视为可疑 } // 忽略大小写扫描关键词 foreach ($dangerousKeywords as $keyword) { if (stripos($pdfContent, $keyword) !== false) { return true; } } return false; } // 处理文件上传的示例逻辑 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['pdf_file'])) { $uploadedFile = $_FILES['pdf_file']; // 基础校验:是否为PDF(注意MIME类型可被篡改,仅作初步过滤) if ($uploadedFile['type'] !== 'application/pdf') { die('请上传PDF格式文件'); } // 临时文件路径 $tempFilePath = $uploadedFile['tmp_name']; // 检测是否存在恶意内容 if (isPdfMalicious($tempFilePath)) { die('上传的PDF文件包含潜在威胁,禁止上传'); } // 检测通过,处理文件(如移动到安全目录、重命名等) $targetDir = './safe_uploads/'; if (!is_dir($targetDir)) { mkdir($targetDir, 0755, true); } $targetFilePath = $targetDir . uniqid() . '.pdf'; if (move_uploaded_file($tempFilePath, $targetFilePath)) { echo '文件上传成功且安全'; } else { echo '文件上传失败'; } } ?> <!-- 上传表单示例 --> <form method="post" enctype="multipart/form-data"> <input type="file" name="pdf_file" accept=".pdf" required> <button type="submit">上传PDF</button> </form>
注意事项
- 这是初步检测方案:如果遇到经过混淆、加密的恶意PDF,可能无法精准识别。若需要更高精度的检测,可考虑使用专业PDF解析库(如
tcpdf、FPDF的扩展工具)或调用第三方安全接口。 - 内存优化:对于超大PDF文件,建议改用
fopen分段读取并扫描,避免file_get_contents导致内存溢出。 - 安全加固:上传后的文件务必存储在非Web可直接访问的目录,或重命名为随机文件名,防止恶意文件被直接执行。
内容的提问来源于stack exchange,提问作者Junior
相关产品推荐
相关产品推荐

