4

我在针对其他中文字符验证中文字符时遇到问题,例如,我正在创建一个简单的密码脚本,该脚本从数据库中获取数据,并通过 get 获取用户输入。

我遇到的问题是出于某种原因,即使当您回显它们时字符看起来完全相同,我的 if 语句仍然认为它们是不同的。

我尝试使用 htmlentities() 函数对字符进行编码,数据库中的密码很好地编码,给了我一个有效的 '& #35441;' (我在里面放了一个空格来阻止它转换成汉字!)。

另一个用户输入值给了我很多有趣的字符。我认为唯一必须打破它的是它以不同的方式编码,因此 php 认为它是 2 个完全不同的字符串。

有人有什么想法吗?
提前致谢,
威尔

编辑:
感谢大家的快速响应,我将四处寻找将数据库编码设置为 UTF-8,但是目前,数据库的结果不是问题,它们使用 htmlentities 正确编码,这是我的结果从导致问题的 $_GET 获取。

干杯,
威尔

4

4 回答 4

3

对于密码,我的建议是不要进行直接比较,因为这意味着您将密码存储在明文中。至少在存储它们之前通过 MD5 或 SHA 之类的哈希(最好也使用盐值)运行它们。然后你只需要比较哈希值,通常是十六进制值,所以不应该导致任何编码问题。

对于非密码值,听起来您的数据库和 PHP 的编码不同,因此它们没有正确匹配。如果 MySQL 以您想要的方式存储它们,让它进行比较(而不是让它首先返回值),这应该避免 1 次通过编码更改,这似乎是问题所在。

于 2010-04-14T13:02:00.390 回答
0

由于您无论如何都应该存储密码的哈希而不是密码本身,这可能是解决方案的一部分。您存储哈希而不是密码,因此数据库没有问题。

也就是说,不同的浏览器对它们提交的字符串进行编码的方式可能会有所不同。这不是我很喜欢的东西,但你最好确保找到一个解决方案,在所有浏览器上生成完全相同的字符串。将接受字符集设置为 utf-8 是明智之举,您可能还想弄乱 enctype。

于 2010-04-14T13:25:43.597 回答
0

如果您想存储密码,请阅读以下内容:您需要了解的有关安全密码方案的信息。

阅读后,您的根本问题似乎是您从用户收到的内容与从数据库获得的内容之间存在一些字符编码不匹配。如果你使用的是 Mysql 和 utf-8 编码,你首先使用SET names "utf-8"查询吗?

于 2010-04-14T13:03:05.157 回答
0

正如其他人所说,使用 SHA1 和 MD5 保存值可能会解决您的问题。这也是一个安全的过程。这是一个可以提供帮助的代码片段。

public function getHashedPassword()
{
    $salt = 'mysalt';
    return  sprintf( "%d%s",$salt,sha1( sprintf( "%d%s", $salt,$this->_rawPassword) ));
}

比较后,重新散列密码输入并将其与数据库中保存的散列密码进行比较。这样做可能会消除编码问题。

于 2010-04-14T13:16:07.477 回答