我正在尝试设置一个 PHP 页面,该页面将安全地接受文件上传(简历),将其存储为 mysql blob,并稍后提供下载。但是当我稍后下载 PDF 进行查看时,它们似乎总是损坏并且无法正常打开。
感谢 Jgoettsch 提出的问题(php: reversing mysql_real_escape_string's effects on binary),我意识到通过 mysql_real_escape_string 提供文件数据(以防止注入)可能会损坏文件内容,并想到通过 base64_encode() 传递二进制文件,并在下载前使用 base64_decode() 。
这是一些样机代码,演示了我目前正在做什么(不起作用):
上传:
<?
// Get file contents
$cv_pointer = fopen($_FILES['cv']['tmp_name'], 'r');
$cv_content = fread($cv_pointer, filesize($_FILES['cv']['tmp_name']));
fclose($cv_pointer);
// Insert SQL
$sql = sprintf("INSERT INTO documents (name, file, size, date_uploaded)
VALUES ('%s', '%s', '%s', NOW())",
mysql_real_escape_string($_FILES['cv']['name']),
mysql_real_escape_string($cv_content),
mysql_real_escape_string($_FILES['cv']['size']));
$result = mysql_query($sql);
?>
和下载:
<?
if (isset($_GET['view_cv'])) {
$cv = mysql_fetch_assoc($rsApplicationCv);
header("Content-length: ".$cv['size']);
header("Content-type: application/pdf");
header("Content-disposition: attachment; filename=".$cv['name']);
echo $cv['file'];
exit();
}
?>
以下是我的问题:
- 如果您有文件上传字段,该字段是否容易受到 sql 注入?还是我不必要地担心?显然,如果我可以将二进制文件传递到 blob 字段而不进行任何翻译,那么这个文件上传任务会简单得多。
- 如果我通过 base64_encode() 提供上传的文件内容,那是否等同于清理?还是我应该对其进行编码,然后另外通过 mysql_real_escape_string 传递编码的字符串?
- 这一切似乎只是为了存储和获取 PDF 付出了很多努力。对于这种常见需求,是否有更简单的解决方案,我还没有偶然发现?
提前致谢!