2

我在创建的网站中有一个登录表单。我使用 PHP 验证密码,密码存储在 MYSQL 数据库中。我面临的问题是密码不区分大小写。它接受字符而不考虑大小写.我正在使用 Kubuntu linux 操作系统

有人可以帮忙解决这个问题吗?我应该在 mysql/my.cnf 中为 COLLATION 使用什么值来避免这种情况?或者还有其他解决方案吗?

任何帮助是极大的赞赏。

谢谢。

4

6 回答 6

10

您的 MySQL排序规则可能不区分大小写。将存储密码的列更改为区分大小写的排序规则。

一些经验法则:

  • 当排序规则以 _ci 结尾时,它不区分大小写。
  • 当排序规则以 _cs 结尾时,它区分大小写。

例子:

  • utf8_general_ci 不区分大小写。
  • utf8_bin 区分大小写

然而,一个重要的注意事项

如果您遇到此问题,则可能是您存储的密码错误。您不应该以纯文本形式存储密码,而应该存储密码的哈希值,并正确加盐。

然后,当用户登录时,您对他的条目进行哈希处理,并将哈希值与您的数据库保存的内容进行比较。当两者相等时,用户可能输入了正确的密码。

于 2012-04-10T07:56:35.867 回答
1

这意味着您以明文形式存储密码,这通常不是一个好主意。无论如何,一种选择是检索密码并在 PHP 中而不是在 WHERE 子句中进行比较。

于 2012-04-10T07:58:55.913 回答
1

解决问题的另一种方法是在将密码存储到数据库之前对其进行哈希处理。这也将提高安全性,因为密码不会未加密地存储在数据库中。

$hash_to_store_in_database = sha1($password);

您可以在网上搜索如何存储散列密码、使用盐和所有其他安全措施。

于 2012-04-10T07:58:59.580 回答
1

虽然 Konerak 的答案是正确的,但我会采用不同的方式,不以明文形式存储密码,而是以散列形式存储,可能是md5or sha1

于 2012-04-10T07:59:11.343 回答
1

似乎您正在以一般文本形式存储密码。否则排序规则utf8_general_ci一般不应该是一个问题。

在存储密码时,您应该使用 md5() 或 sha1() 对密码进行哈希处理。

于 2012-04-10T08:02:32.327 回答
0

您可以在 php中使用strcmp函数或使用类似

"SELECT [...] WHERE BINARY tablename.password = $form_password"
于 2012-04-10T08:00:16.303 回答