2

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

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

4

6 回答 6

9

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

我认为使用准备好的 SQL 语句是一种更广泛接受的解决方案。看到这个问题

于 2012-07-26T17:31:34.720 回答
3

是的,但是一旦你散列了信息,你就不能从散列中重新生成信息。请改用编码方法。

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

于 2012-07-26T17:31:25.140 回答
1

只要您的散列输出在 mysql 中没有任何冲突的字符,那么我绝对会说是的。base64 是做这样的事情的好方法

于 2012-07-26T17:28:52.067 回答
1

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

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

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

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

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

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

于 2015-11-12T18:01:48.340 回答
0

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

于 2012-07-26T17:29:37.117 回答
0

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

$em = mysql_real_escape_string($_REQUEST['email']);
$pw = mysql_real_escape_string($_REQUEST['password']);
at the insert you use the password($pw) function.
于 2012-07-26T17:36:12.490 回答