SQL查询中的散列密码字段是否需要参数化调用/清理/转义字符?

时间:2010-12-31 19:50:27

标签: sql passwords sql-injection

在为网站编写登录系统时,标准的做法是使用参数化调用的一些组合,清理用户输入和/或转义特殊字符以防止SQL注入攻击。

然而,任何好的登录系统都应该在进入SQL查询之前对每个密码进行哈希(并且可能是盐),那么是否仍然需要担心密码中的SQL注入攻击?散列是否完全消除了SQL注入攻击的可能性?

编辑:如果当前的网站确实清理了他们的密码字段,或者通常没有人担心,我也很好奇。

3 个答案:

答案 0 :(得分:3)

最好假设对数据库的任何调用都可以进行查询注入。

就个人而言,我非常怀疑使用SHA1哈希的调用是否能够注入代码,但是有什么理由你不会对它进行清理吗?

处理注射时,偏执狂是最好的方法;)

答案 1 :(得分:1)

可能不是。

但是,哈希密码不是数据库调用的另一个参数吗?你的意思是你为除了使用字符串连接的密码之外的所有其他输入混合'n'match参数化吗?

答案 2 :(得分:0)

取决于你正在做什么样的查询。

如果您的查询符合

SELECT username from user_logins WHERE 
  username=? AND password_md5 = md5(?)

然后没有转义md5函数内的指定密码会导致sql注入漏洞。

只要一直使用参数化查询,除非有一些令人难以置信的好理由你不能(提示:IN(...)不能很好地与它们配合使用)。

参数化查询比转义更容易,更安全。