在此代码中
UPDATE table SET field = MD5('{$_POST['variable']}') WHERE id = 1;
由于更新后的值是md5'ed,我是否还应采取措施防止注射?像addslashes()或类似的东西?
答案 0 :(得分:5)
您没有将MD5哈希传递给SQL查询,而是传递了MySQL稍后会哈希的纯文本。所以,是的,你应该采取措施防止SQL注入。或者甚至更好,在PHP中哈希,然后在查询中使用哈希。
如果您正在散列密码,则MD5被认为是弱的。 Use bcrypt instead
答案 1 :(得分:3)
由于更新后的值是md5,我是否仍应采取措施防止注射?
实际上,代码中的变量在进入查询字符串时不已被MD5编辑,因此相同的注入问题仍然适用于任何其他变量。< / p>
如果您已在PHP中完成$hashedVar = md5($var)
,然后将$hashedVar
添加到查询字符串中,那么您的问题可能更合理一些,但是您使用MD5()
作为查询字符串本身的一部分,答案是肯定的,它肯定需要进行转义以避免注入。
然而还有一些补充说明:
addslashes()
不是用于将PHP字符串转义为SQL的正确方法。您应该使用适用于您正在使用的DB API的真实转义字符串函数。
如果您使用mysqli
或PDO
作为数据库API,那么最佳选择就是预先准备好的语句。如果您使用较早的mysql_xxx()
功能,那么您没有此选项,但您应该更新到其他API之一,因为mysql
扩展程序已被弃用。
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更强大的东西。
进一步的缓解措施包括强大的输入验证和通过代理的数据库 - 网络服务器分离。没有关于你的系统的更多详细信息(请不要在这里发布任何这些细节),我不相信我可以推荐任何进一步的防御措施。