我正在尝试设置一个PHP页面,该页面将安全地接受文件上传(简历),将其存储为mysql blob,并在稍后提供下载。但是,当我下载PDF以后查看时,它们总是看起来已经损坏,无法正常打开。
由于Jgoettsch (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();
}
?>以下是我的问题:
提前感谢!
发布于 2013-07-31 19:38:27
Q如果您有一个文件上传字段,该字段是否易受sql注入的影响?
A是的(有点。受SQL注入攻击的不是表单上的字段;该漏洞实际上在处理请求中提交的值的代码中。)
Q还是我不必要地担心?
A No.您应该始终意识到可能发生的坏事,并以防止漏洞暴露(和利用)的方式编写代码。
Q如果我通过base64_encode()提供上传的文件内容,这是否等同于消毒?
A它就在那里,只要您的base64_encode保证返回的值只包含A-Za-Z0-9+.=。最佳实践是使用绑定参数。
Q,还是我应该对它进行编码,然后再通过mysql_real_escape_string传递编码的字符串?
--禁止使用带绑定参数的准备语句的,然后最佳实践规定,如果所有值(包括base64_encoded值)都包含在要提交到数据库的SQL中,则这些值都要在mysql_real_escape_string中运行。
发布于 2013-07-31 18:33:06
既然你说的是消毒,我想这是一个公共网站,陌生人会上传文件。存储用户提交的PDF文件是非常糟糕的想法。首先,你怎么能确定你收到的文件甚至是一个PDF?用户可以100%地将恶意文件压缩到数据库中,并让用户不知情地下载病毒。PDF本身(如果我没记错的话)实际上可以在某些Windows操作系统中执行病毒,就像WMV和WMA文件一样。
如果您绝对需要一个PDF,那么最好的选择是使用用户提交的净化数据创建创建您自己的文件。您可能会在网上找到关于如何做到这一点的教程。我个人不建议首先使用PDF,因为您可以使用HTML和CSS来构建简历并完美地打印出来。
https://stackoverflow.com/questions/17978034
复制相似问题