Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:base64_编码可以防止mysql注入吗?_Php_Mysql_Blob_Sanitization - Fatal编程技术网

PHP:base64_编码可以防止mysql注入吗?

PHP:base64_编码可以防止mysql注入吗?,php,mysql,blob,sanitization,Php,Mysql,Blob,Sanitization,我正在尝试设置一个PHP页面,该页面将安全地接受文件上传(简历),将其存储为mysql blob,并在稍后提供下载。但当我稍后下载PDF以供查看时,它们似乎总是损坏,无法正常打开 由于Jgoettsch()提出了一个问题,我意识到通过mysql_real_escape_字符串(防止注入)提供文件数据可能会损坏文件内容,于是我想到将二进制文件通过base64_encode()传递,并在下载前使用base64_decode() 下面是一些模拟代码,演示了我目前正在做的事情(不起作用): 上传: &l

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

由于Jgoettsch()提出了一个问题,我意识到通过mysql_real_escape_字符串(防止注入)提供文件数据可能会损坏文件内容,于是我想到将二进制文件通过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);
?>

既然你说的是消毒,我假设这是一个公共网站,陌生人将上传文件。存储用户提交的PDF文件是一个非常糟糕的想法。首先,你如何确定你收到的文件是PDF格式的?用户完全有可能将恶意文件卷曲到您的数据库中,并让用户在不知不觉中下载病毒。PDF本身(如果我没记错的话)实际上可以通过故障在某些Windows操作系统中执行病毒,就像WMV和WMA文件一样


如果您确实需要PDF,那么最好的选择是使用用户提交的经过消毒的数据创建您自己的PDF文件。你可能会在网上找到一个关于如何做到这一点的教程。我个人不建议首先使用PDF,因为你可以使用HTML和CSS构建简历并完美打印出来

Q如果您有一个文件上载字段,该字段是否易受sql注入攻击

A是(某种程度上,表单上的字段不易受到SQL注入的攻击;该漏洞实际上存在于处理请求中提交的值的代码中。)

Q还是我担心得不必要

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

Q如果我通过base64_encode()提供上传的文件内容,这是否等于消毒

A只要base64_编码保证返回值只包含[A-Za-z0-9+./=],它就快到了。最佳实践是使用绑定参数

Q或者我应该对其进行编码,然后通过mysql\u real\u escape\u字符串额外传递编码的字符串


A禁止使用带绑定参数的准备语句,那么最佳实践要求所有值(包括base64_编码的值)都通过mysql_real_escape_字符串运行,如果它们包含在要提交到数据库的SQL文本中。

使用mysqli或PDO,并使用准备好的查询和占位符,这应该可以解决编码和注射的问题。注射是安全的,就像不把叉子塞进电源插座可以防止触电一样。注入漏洞的规则:如果您在查询中使用“外部”数据,那么您是易受攻击的。不管数据来自哪里,即使是你自己。你仍然可以很容易地注入你自己的查询。@Alien先生:介意更具体地说明你不想做什么吗?在数据库中存储任意二进制数据通常被认为是一个坏主意。您应该存储的是对磁盘上文件的引用,或者像AmazonS3这样的大容量对象存储服务。另外,请不要在新代码中使用
mysql\u query
,它已被弃用,并将从PHP的未来版本中删除。如果正确执行,转义二进制数据不会损坏它。@TopherHunt这不是转义数据的最佳方法,但如果您仍然使用吱吱作响的
mysql\u查询
接口,这是可靠执行此操作的唯一方法。转义只是为了让MySQL正确地解释您的数据而进行的,在检索数据时应该可以。然而,如果你不小心双重逃逸了你的数据,它会把事情弄得一团糟。我强烈建议不要在数据库中放置任意二进制文件。他们不属于那里。谢谢安德鲁。PDF将由公众提交,短期内我看不到解决这一问题的办法。我们需要让未来的实习生申请职位变得容易,并以最标准的表格(.docx、.doc、.pdf)接受他们的简历。要求应聘者将简历复制粘贴到CKeditor或类似的东西中是不可能的。是的,我知道你想构建一个对用户友好的web应用程序,但在处理文件时,这会变得相当困难。除了让自己暴露在安全漏洞之下,我看不到短期的解决方案。一般来说,您不必担心来自MYSQLi或PDO的注入,但真正的问题是下载files.PDF文件的用户通常不易受到攻击。我不知道最新的Adobe Reader更新是否修复了任何漏洞。这可能确实是值得检查的文件实际上是一个真正的PDF,但没有必要完全放弃PDF上传。谢谢大家。我把这一切都放在心上。听起来mysqli是我需要走的方向,我正朝着这个方向努力。
<? 
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();
}
?>