【问题标题】:Do you even need Database Security anymore? [closed]您甚至不再需要数据库安全性了吗? [关闭]
【发布时间】:2013-04-05 16:54:09
【问题描述】:

这是一个针对 PDO 准备语句的安全问题。使用 PDO 我知道 sql 注入的风险几乎是不可能的,并且该类会为您处理所有这些。使用它们 mysql_* 堆栈后,我总觉得好像我没有很好地处理安全问题。我通常习惯于编写数百行代码来处理安全问题,而现在我实际上只是在编写查询。

除了数据库中字符串的长度之外,PDO 语句是否真的存在任何安全威胁?

【问题讨论】:

  • 这有点像问“在编程中我需要注意什么安全问题吗?”可能太宽泛了。
  • 其实我认为这是一个定义相当明确的问题,基本上是“POD 不会自动防御哪些安全威胁”我喜欢它。
  • IT 中没有什么是 100% 安全的。 PDO 只是另一道防线。在将输入传递给查询之前,您仍然应该验证输入...
  • PDO 只是保护您免受与 SQL 相关的东西的影响。 Web 上还有许多其他安全风险,从简单的 Javascript 注入到更多“异国情调”的问题,例如与字符编码有关的 XSS 攻击。大多数这些事情都通过您准备好的陈述进行。

标签: php mysql pdo


【解决方案1】:

我认为“sql 注入攻击”的答案非常接近肯定。 mysqli prepared statements and mysqli_real_escape_string

还有很多其他类型的攻击,但至少你所有的值都被转义了。

依靠 PDO 来“修复”您的安全性就像依靠编译器来查找您的错误。

【讨论】:

    【解决方案2】:

    肯定是的。

    事实上,原生准备语句仅适用于简单的教科书案例。
    意味着您仍然需要为任何复杂的情况编写一些“数百行”。我在PDO tag wiki 中对此类案例做了一个小摘要。主要缺点是

    • 没有标识符的占位符。您必须像在旧的良好 mysql_* 代码中一样手动格式化和注入它们。
    • 数组没有占位符。意味着您仍然必须手动编写一些代码,然后将其注入查询中 - 因此,仍然有可能陷入一些麻烦。

    因此,即使在 PDO 上,您也需要更高级别的抽象。一个常见的解决方案是使用每个现代框架都提供的某种 Query Builder

    但我个人讨厌查询构建器,因为它们在我看来过于臃肿,假装替换整个 SQL 但显然失败了。所以,当我可以使用纯 SQL 时,我不明白为什么要使用用 PHP 编写的 SQL。为此,我创建了一个抽象库,以纠正原生准备语句的所有缺点,safeMysql。它为您需要的所有内容提供占位符,因此使查询比 PDO 更安全,但它使应用程序代码大大缩短。

    使用 safeMysql 意味着您确实可以“只字面上写查询”:

    $sql  = "SELECT * FROM articles WHERE id IN(?a) ORDER BY ?n LIMIT ?i"
    $data = $db->getAll($sql, $ids,$_GET['order'], $limit);
    
    $sql  = "INSERT INTO stats SET pid=?i,ip=inet_aton(?s),?u ON DUPLICATE KEY UPDATE ?u";
    $db->query($sql, $pid, $ip, $data, $data);
    

    只需将这些 2 行代码与您需要使用原始 PDO 编写的代码量进行比较。

    【讨论】:

      猜你喜欢
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多