【问题标题】:Safety/sanitization when storing images in DB with PHP使用 PHP 在数据库中存储图像时的安全/消毒
【发布时间】:2013-02-12 22:46:07
【问题描述】:

我希望将应用程序的图像存储在 MSSQL 数据库中。 (我知道关于这个或文件系统存储是否更好存在一些争论;不过那是另一个线程。)我正在考虑做一些类似于http://forum.codecall.net/topic/40286-tutorial-storing-images-in-mysql-with-php/ 但在 CodeIgniter 中的事情:

foreach ($_FILES as $upload_name => $info) {
    if ($info['name']) {
        // Temporary file name stored on the server
        $tmpName  = $info['tmp_name'];  

        // Read the file 
        $fp      = fopen($tmpName, 'r');
        $data = fread($fp, filesize($tmpName));
        fclose($fp);

        //model code consolidated here for ease of question-asking
        $db = $this->load->database();
        $stmt = $db->insert('my_table', array('image' => $data));
    }
}

我的问题主要是关于安全的。基本上,对于清理图像二进制数据插入与其他类型的字符串数据,我应该有什么特别的担忧吗?我从上面链接的站点中取出了代码中的 addlashes(),因为我知道 CI 的活动记录会自行进行一些清理,但我不知道拥有它是否更好(或完全做一些其他准备工作)。

【问题讨论】:

  • 安全在什么意义上?你害怕发生的事情的一个例子是什么?顺便说一句:addslashes 不应该用于在 SQL 查询中转义参数,这不是它的目的。你是问 SQL 注入还是别的什么?
  • 如果您的数据是一个 blob,并且您从不操作它,则没有理由对其进行清理。重要的问题是:从存储中读取数据时如何使用这些数据?您是否将其存储在客户端的临时文件中?
  • @WesleyMurch 是的,我只是想知道 SQL 注入;之前没有将图像存储在数据库中,所以不确定是否有额外的问题。
  • @didierc 还没有完全弄清楚那部分,但最终目标是能够在请求时动态检索图像并将其显示给用户。如果您对此有任何指导,我将不胜感激。 :)
  • 我的猜测是,您将有某种 id 绑定到图像,并有一个临时磁盘空间来存储图像。每当客户端请求图像时,它会首先尝试找到它在磁盘上,如果不存在则运行 sql。磁盘空间的行为类似于缓存,您必须定义如何管理空间的规则,这可能是最棘手的部分,当然值得单独提出一个 SO 问题。

标签: sql-server database image codeigniter sanitization


【解决方案1】:

如果我正确理解您的问题,您不必担心,只要您将 file_type(文件的 Mime 类型)与它一起存储,并在 Mime 类型与二进制数据之前存储。然后,每当您处理数据时,请确保将其与正确的 Mime 类型一起使用,这样即使他们上传了病毒脚本,您也可以确保它仅呈现为图像,而不是让您的服务器或浏览器处理它。

除此之外,我认为您不需要将上传文件拉入内存并尝试清理它。

【讨论】:

  • 跟踪 mime 类型确实是必不可少的。我想知道发现文件的真实类型(以防用户错误)是否是一件好事。
猜你喜欢
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2015-10-26
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
相关资源
最近更新 更多