Php 加密可以防止sql注入吗?

Php 加密可以防止sql注入吗?,php,sql,encryption,web,code-injection,Php,Sql,Encryption,Web,Code Injection,在将值插入SQL查询之前对其使用哈希是否可以防止SQL注入,而不必使用mysql\u real\u escape\u字符串?(假设您要为整个站点执行此操作) 编辑:具体来说,其目的是从用户处获取一个键并对其进行散列,然后将其与表中的其他散列进行比较,然后检索散列匹配的另一列值。很抱歉没有指定,只要您的散列输出在mysql中没有任何冲突字符,那么我绝对会说是的。base64是执行类似操作的一种很好的方法如果您正在考虑md5()或sha1(),您将永远无法解密哈希。如果你有自己的加密算法,我说去吧。

在将值插入SQL查询之前对其使用哈希是否可以防止SQL注入,而不必使用mysql\u real\u escape\u字符串?(假设您要为整个站点执行此操作)


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

,只要您的散列输出在mysql中没有任何冲突字符,那么我绝对会说是的。base64是执行类似操作的一种很好的方法

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

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


另外,
mysql\uuquot/code>*函数已经(或即将)被弃用。您应该考虑切换到<代码> MySqLI:/COD>或<代码> PDO。如果你是一个懒惰的流浪汉(和我一样),你可以使用
mysqli
过程式风格,这几乎与原始的
mysql\uu
函数相同。

是的,但它也会使你的数据变得无用P记住,散列是单向的,因此您无法获取有意义的数据。加密是双向的,这可能就是你真正的意思


我认为,对于这类事情,使用准备好的SQL语句是一种更为广泛接受的解决方案。请参阅。

在我看来,我认为您应该同时使用这两种方法,下面是一个示例:

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

可以,但前提是您将密钥同时存储为加密密钥和散列密钥。我刚刚完成了一个实现这一点的tcl脚本。主要程序应该对您有所帮助。 获取纯文本密钥和散列,也加密此纯文本密钥,并将两者存储在与正在保存的表单数据相同的行中(也加密)

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

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

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

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


如果使用tcl,那么使用大括号也会有所帮助,这样可以防止问题从什么值的哈希开始,而不是什么值的哈希开始?整个输入的哈希与什么相比?我的意思是,您无法取回它,因为它是一个哈希值。您的意思是,例如:从表中选择*,其中“[hash data]”='a';?请花一分钟来理解。有趣的是,我从来没有玩过msqli函数。谢谢你的提示,我也知道这一点,对这个问题有很多见解,谢谢@kjh注意,加密会创建二进制数据,您无法将其存储在传统的
char
字段中。这也是为什么我建议使用编码(例如:base64)而不是加密(例如:AES)。