为什么这么多密码教程在哈希密码之后使用“mysql_real_escape_string”?

时间:2014-04-29 07:07:34

标签: php security hash sql-injection mysql-real-escape-string

当输入被视为字符串并进行哈希处理时,我看不到需要。不会有效地散列它,以及消毒输入吗?这似乎浪费了大约几百个CPU周期,并不重要,但我没有看到需要。

我意识到我需要使用crypt来保护我的密码。

编辑:举个例子:

$password = $_POST['password'];
$password = strip_tags($password); 
$password = sha1($password);

对我来说毫无意义。

1 个答案:

答案 0 :(得分:4)

The Internet is full of chimpanzees

这就是为什么总是被提及的主要原因 在这些教程中,只使用了原始的PHP甚至没有抽象的格式,它确实是多余的。

但实际上,在实际应用mysql_real_escape_string或等效应用。不是前面提到的教程中描述的方式,但无论如何。

在设计合理的应用程序中,数据库层必须与其他逻辑分开。并且在查询执行时它必须完全不知道数据源或性质。意味着必须以相同的方式处理所有数据。即字符串必须引用和转义。

因此,您的密码必须发送到数据库层,并在那里作为常规字符串处理。并且,取决于图层体系结构,它可以被转义和引用,或作为与查询分离的参数发送,或以某种方式编码 - 但这根本不应该是我们关心的。

  

不会有效地散列它,嗯,消毒输入?

注意强调的词。

您错误解释mysql_real_escape_string或类似功能的目的而产生的特殊困惑。事实上,它确实没有消毒。它真正做的是所需格式的一部分。放入SQL查询的字符串必须正确格式化。总是。尽管有源,内容或星座的插入。

毕竟,一些散列函数可能会返回二进制字符串,几乎可以包含一个特殊字符。但又一次 - 为什么要打扰呢?这些CPU周期不值得整体理智和应用程序安全性的一小部分。