0

我有一个从我的密码中删除字符的功能。

public function stripChars($var)
{
    $bad_symbols = array(",", "|", "'","<",">",'"');
    $var = str_replace($bad_symbols, "", $var);
    return $var;
}

我想知道是否有办法让用户在密码中使用逗号,而不会弄乱 SQL 语句?如果不是,除了我已经剥离的符号之外,我不应该在密码中允许哪些符号。谢谢。

4

4 回答 4

9

在插入数据库之前,我应该从用户密码中删除哪些字符?

一个都没有。删除的字符越多,密码越弱。

我想知道是否有办法让用户在密码中使用逗号,而不会弄乱 SQL 语句?

  1. 不要手动构建 SQL。使用准备好的语句和绑定变量。这将转义任何可能导致问题的字符。
  2. 不要在数据库中存储纯文本密码。散列它们
于 2013-03-15T21:13:31.007 回答
1
without it messing up the SQL statement?

哎呀,你需要阅读 SQL 注入:http ://en.wikipedia.org/wiki/SQL_injection

因此,您应该允许密码中包含任何字符,并确保不要直接在 SQL 语句中使用输入。

于 2013-03-15T21:15:27.870 回答
1

您永远不应该从用户密码中删除字符。如果他们输入密码为“r2^£XS\'32”,然后您在存储之前对其进行过滤,他们将永远无法登录,因为他们的密码将不正确。

至于是否应该限制密码中的字符,那是另一回事。您需要限制不属于您使用的任何字符编码的字符,但除此之外,这是一个坏主意。限制可用的字符集使蛮力攻击更容易成功。

相反,您想要做的是使用准备好的语句,因为这些将防止 SQL 注入(我相信这是您所关心的)。

还值得一提的是,您应该在存储密码之前对其进行哈希处理;永远不要存储为纯文本或可逆加密。理想情况下,还要对密码加盐以提高安全性。

查看密码散列PDO 以及准备好的语句以获取更多信息

于 2013-03-15T21:15:32.077 回答
-1

您不应该从密码中删除任何字符!但是,在将它们放入数据库或比较身份验证之前,请先“转义”它们。

于 2013-03-15T21:14:52.550 回答