【问题标题】:Does encryption protect against sql injection?加密是否可以防止 sql 注入?
【发布时间】:2012-07-26 17:26:51
【问题描述】:

在将值插入 SQL 查询之前使用哈希值是否可以防止 sql 注入,甚至不必使用 mysql_real_escape_string? (假设您要为整个网站执行此操作)

编辑:具体来说,目的是从用户那里获取一个键并在将其与我表中的其他散列列进行比较之前对其进行散列,然后检索散列匹配的另一个列值。抱歉没有具体说明

【问题讨论】:

  • 什么值的哈希值与什么值的哈希值相比?整个输入的哈希与什么相比?我的意思是,你无法取回它,因为 它是一个哈希
  • 你的意思是例如:select * from table where '[hash data]' = 'A';?

标签: php sql encryption web code-injection


【解决方案1】:

是的,但它也会使您的数据变得无用。 :P 请记住,散列是单向的,因此您将无法取回有意义的数据。加密是两种方式,这可能是您真正的意思。

我认为使用准备好的 SQL 语句是一种更广泛接受的解决方案。见this question

【讨论】:

  • 从来不知道这个,对这个问题有很多见解,谢谢!
  • @kjh 请注意,加密会创建二进制数据,您无法将其存储在传统的char 字段中。这也是我推荐使用编码(例如:base64)而不是加密(例如:AES)的原因。
【解决方案2】:

是的,但是一旦对信息进行哈希处理,就无法从哈希中重新生成信息。请改用编码方法。

另外,mysql_* 函数已(或即将)弃用。您应该考虑切换到mysqliPDO。如果你是一个懒惰的流浪汉(像我一样),你可以使用mysqli 程序样式,它与原始mysql_ 函数几乎相同。

【讨论】:

  • 有趣的是我从来没有玩过 msqli 函数。感谢您的提示
【解决方案3】:

只要你的散列输出在 mysql 中没有任何冲突的字符,那么我肯定会说是的。 base64 是一种很好的方法来做这样的事情

【讨论】:

    【解决方案4】:

    是的,但前提是您将密钥既加密又作为哈希存储。我刚刚完成了一个执行此操作的 tcl 脚本。主要程序应该对您有所帮助。 获取纯文本密钥和哈希,同时加密此纯文本密钥并将它们存储在与您正在保存的表单数据相同的行中(也加密)。

    通过解密密钥列并插入框中,使用纯文本密钥填充下拉列表或其他内容。现在您可以选择纯文本键进行搜索。

    这需要加密、解密和散列路由,每次您想要添加、更新、删除记录或显示记录时都会调用该路由,但我注意到它并没有减慢,尽管我确信它存在于微秒级。

    确保您的加密来自标准化且受人尊敬的来源,例如 openssl 或类似来源,以便您可以使用自动填充和自动 IV 创建进行 cbc。这种方式就像数据库中的单词以不同的方式加密。这也是您需要散列密钥的原因。否则它将以不同的方式加密,您将无法搜索任何内容。

    以这种方式,一个键被散列并与其他散列值进行检查。尝试将一组恶意的单词插入到一个字段中,可能发生的情况是它被散列成一个非危险的单词。

    如果使用 tcl,它也有助于使用花括号,这应该可以防止出现问题

    【讨论】:

      【解决方案5】:

      如果您正在考虑 md5() 或 sha1(),您将永远无法解密哈希。如果你有自己的加密算法,我说去吧。

      【讨论】:

        【解决方案6】:

        在我看来,我认为你应该同时使用它们,这里是一个例子:

        $em = mysql_real_escape_string($_REQUEST['email']);
        $pw = mysql_real_escape_string($_REQUEST['password']);
        at the insert you use the password($pw) function.
        

        【讨论】:

          猜你喜欢
          • 2021-10-06
          • 1970-01-01
          • 2013-02-25
          • 1970-01-01
          • 1970-01-01
          • 2019-12-06
          • 2013-08-01
          • 2015-07-22
          • 2013-03-20
          相关资源
          最近更新 更多