在MySQL中使用md5时安全性逃逸

时间:2013-11-19 16:29:31

标签: php mysql security

在此代码中

UPDATE table SET field = MD5('{$_POST['variable']}') WHERE id = 1;

由于更新后的值是md5'ed,我是否还应采取措施防止注射?像addslashes()或类似的东西?

5 个答案:

答案 0 :(得分:5)

您没有将MD5哈希传递给SQL查询,而是传递了MySQL稍后会哈希的纯文本。所以,是的,你应该采取措施防止SQL注入。或者甚至更好,在PHP中哈希,然后在查询中使用哈希。

如果您正在散列密码,则MD5被认为是弱的。 Use bcrypt instead

答案 1 :(得分:3)

  

由于更新后的值是md5,我是否仍应采取措施防止注射?

实际上,代码中的变量在进入查询字符串时已被MD5编辑,因此相同的注入问题仍然适用于任何其他变量。< / p>

如果您已在PHP中完成$hashedVar = md5($var),然后将$hashedVar添加到查询字符串中,那么您的问题可能更合理一些,但是您使用MD5()作为查询字符串本身的一部分,答案是肯定的,它肯定需要进行转义以避免注入。

然而还有一些补充说明:

  1. addslashes() 不是用于将PHP字符串转义为SQL的正确方法。您应该使用适用于您正在使用的DB API的真实转义字符串函数。

    如果您使用mysqliPDO作为数据库API,那么最佳选择就是预先准备好的语句。如果您使用较早的mysql_xxx()功能,那么您没有此选项,但您应该更新到其他API之一,因为mysql扩展程序已被弃用。

  2. MD5 是密码的安全哈希算法。如果您使用普通的无盐MD5作为密码,那么在您开始考虑注入攻击之前,您已经不安全了。您应该使用更好的散列算法,例如bcrypt

    最近的PHP版本包含一组password_xx() functions,专门用于以最小的努力提供最佳的可用质量哈希。 (这些功能也可用于较旧的PHP版本,通过a third-party library)。

答案 2 :(得分:1)

如果要将变量连接到SQL查询(您应该正在执行;您应该使用预准备语句),那么您需要将其转义。

您首先构建一个字符串,然后将该字符串发送到MySQL。 MD5()在查询中并不重要。如果我将'), field2 = 0; -- '作为$_POST['variable']发送,您将获得:

UPDATE table SET field = MD5(''), field2 = 0; -- '') WHERE id = 1;

你可以看到的很糟糕。

答案 3 :(得分:0)

如果您使用PHP加密字符串,那么您的SQL查询将不会被注入。

$string = md5($_POST['variable']);

$sql = "UPDATE table SET variable = '$string'";

这比使用MySQL的md5功能更安全,但是你仍然习惯于让所有用户输入都安全。

答案 4 :(得分:0)

正如Spudley所提到的,应该实现一个查询转义以避免SQL注入。 MD5确实是一种弱哈希算法(一些脚本小子工具可以在短短五分钟内破解它),并且密码肯定需要用更强大的哈希算法来保护。

话虽如此,我还会考虑您系统的威胁和风险环境。如果您正在为永远不会连接到互联网的系统开发数据库,​​唯一的威胁来自恶意内部用户或错误(愚蠢的用户风险=非常不可能),MD5可能在短时间内就足够了。如果可以通过互联网或网络连接访问,这将使知识渊博的用户有目的地注入SQL命令,您的风险更高,我强烈建议任何比MD5更强大的东西。

进一步的缓解措施包括强大的输入验证和通过代理的数据库 - 网络服务器分离。没有关于你的系统的更多详细信息(请不要在这里发布任何这些细节),我不相信我可以推荐任何进一步的防御措施。