繁体   English   中英

使用php创建一个包含中文字符的密码系统

[英]Using php to create a password system with chinese characters

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

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

我已经尝试使用htmlentities()函数对字符进行编码,来自数据库的密码很好地编码,给我一个工作'話' (我在其中放了一个空格来阻止它转换为汉字!)。

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

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

编辑:
感谢快速响应人员,我会考虑将数据库编码设置为UTF-8,但是目前,数据库的结果不是问题,他们使用htmlentities正确编码,这是我得到的结果$ _GET导致问题。

干杯,

对于密码,我的建议是不做直接比较,因为这意味着你要以明文形式存储密码。 在存储它们之前,至少要通过像MD5或SHA这样的哈希(最好还有一个salt值)来运行它们。 然后你只需要比较哈希值,这通常是十六进制值,所以不应该导致任何编码问题。

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

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

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

使用SHA1和MD5保存值可以解决您的问题,因为另一个说明了。 这也是一个安全的过程。 这是一个帮助的代码片段。

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

通过比较,重新输入密码输入并将其与数据库中的保存哈希密码进行比较。 这样做可能会删除编码问题。

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

也就是说,不同的浏览器如何编码他们提交的字符串可能会有所不同。 这不是我非常喜欢的东西,但你最好确保找到一个解决方案,在所有浏览器上生成完全相同的字符串。 将accept-charset设置为utf-8是一个nobrainer,你可能也想弄乱enctype。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM