PHP:base64_encode 是否可以防止 mysql 注入(inject)?

标签 php mysql blob sanitization

我正在尝试设置一个 PHP 页面,该页面将安全地接受文件上传(简历),将其存储为 mysql blob,并稍后提供下载。但当我稍后下载 PDF 进行查看时,它们总是看起来已损坏并且无法正常打开。

感谢 Jgoettsch ( php: reversing mysql_real_escape_string's effects on binary ) 的问题,我意识到通过 mysql_real_escape_string 提供文件数据(以防止注入(inject))可能会损坏文件内容,并想到通过 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();
}
?>

这是我的问题:

  1. 如果您有文件上传字段,该字段是否容易受到 SQL 注入(inject)攻击?还是我的担心是不必要的?显然,如果我可以将二进制文件传递到 blob 字段而不进行任何翻译,那么这个文件上传任务会简单得多。
  2. 如果我通过base64_encode()提供上传的文件内容,这是否等同于清理?或者我应该对其进行编码,然后另外通过 mysql_real_escape_string 传递编码后的字符串?
  3. 光是存储和获取 PDF 就需要付出很大的努力。对于这个常见需求,是否有一个我还没有偶然发现的更简单的解决方案?

提前致谢!

最佳答案

如果你有一个文件上传字段,该字段是否容易受到sql注入(inject)?

A是的(有点。表单上的字段并不容易受到 SQL 注入(inject)攻击;漏洞实际上存在于处理请求中提交的值的代码中。)

还是我不必要地担心?

A 不。您应该始终意识到发生坏事的可能性,并以防止漏洞暴露(和利用)的方式编写代码。

如果我通过base64_encode()提供上传的文件内容,是否相当于净化?

A 只要您的 base64_encode 保证返回的值仅包含 [A-Za-z0-9+./=],就差不多了。最佳实践是使用绑定(bind)参数

或者我应该对其进行编码,然后另外通过 mysql_real_escape_string 传递编码的字符串?

A 禁止使用带有绑定(bind)参数的准备好的语句,那么最佳实践规定,如果所有值(包括 base64_encoded 值)包含在要提交给数据库。

关于PHP:base64_encode 是否可以防止 mysql 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17978034/

相关文章:

php - 如何在 PhpStorm 中禁用 PHP echo 的高亮显示?

php - 如何通过用户名和键在MySql表中选择一行并在该行中插入数据

java - 如何正确关闭数据源连接?

java - 如何使用 Blob 对象将大型原始 XML 文件写入 Oracle 数据库?

php - 如何使用 jquery/javascript 每秒更新 PHP 当前时间戳

php - Symfony2 : Validating a date using the Form Validator returns error

php - 没有从查询中获取数据。 PDO

mysql - 生物识别模板无法保存在 MySQL 数据库中,因为它为空

android - 获取 Blob 图像并将该图像转换为位图图像

java - 通过 Hibernate 存储和检索图像