Использование php для создания системы паролей с китайскими иероглифами - PullRequest
4 голосов
/ 14 апреля 2010

У меня проблема с проверкой китайских иероглифов по сравнению с другими китайскими иероглифами, например, я создаю простой скрипт пароля, который получает данные из базы данных и получает пользовательский ввод через get.

По какой-то причине у меня возникла проблема, даже если символы выглядят одинаково, когда вы их выводите, мое утверждение if все еще думает, что они разные.

Я пытался использовать функцию htmlentities () для кодирования символов, пароль из базы данных хорошо кодирует, давая мне рабочий '& # 35441;' (Я поместил в него пробел, чтобы он не превратился в китайский символ!).

Другое пользовательское значение дает мне массу забавных символов. Единственное, что, по моему мнению, должно нарушать его, - это то, что он кодирует по-другому, и поэтому php считает, что это 2 совершенно разные строки.

У кого-нибудь есть идеи?
Спасибо заранее,
Будет

Edit:
Спасибо за быстрые ответы, ребята, я посмотрю вокруг установки кодировки базы данных на UTF-8, однако на данный момент результаты из базы данных не проблема, они правильно кодируют, используя htmlentities, это результаты, которые я получаю от $ _GET, которая вызывает проблемы.

Cheers,
Будет

Ответы [ 4 ]

3 голосов
/ 14 апреля 2010

Для паролей я советую не делать прямого сравнения, потому что это означает, что вы храните пароли в открытом виде. По крайней мере, запустите их через хеш, такой как MD5 или SHA (желательно с солт-числом), прежде чем хранить их. Тогда вам просто нужно сравнить значения хеша, которые обычно являются шестнадцатеричными значениями, поэтому не должно вызывать проблем с кодированием.

Для значений, отличных от пароля, похоже, что ваша база данных и PHP не находятся в одной и той же кодировке, поэтому они не соответствуют должным образом. Если MySQL хранит их так, как вы хотите, сделайте сравнение (вместо того, чтобы сначала вернуть значения), чтобы избежать 1 прохода через изменение кодировки, что, вероятно, является проблемой.

0 голосов
/ 14 апреля 2010

Так как вы все равно должны хранить хэши паролей, а не сами пароли, это может быть частью решения. Вы храните хеш, а не пароль, и, следовательно, не имеете проблем с базой данных.

Тем не менее, могут быть различия в том, как разные браузеры кодируют строки, которые они отправляют. Это не то, чем я увлекаюсь, но вам лучше убедиться, что вы найдете решение, которое создает одинаковую строку во всех браузерах. Установка для accept-charset значения utf-8 - это нобрейнер, вам также может понадобиться возиться с энктипом.

0 голосов
/ 14 апреля 2010

Сохранение значений с использованием SHA1 и MD5 может решить вашу проблему, как указано другим. Это также безопасный процесс. Вот фрагмент кода, чтобы помочь.

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

После сравнения перефразируйте введенный пароль и сравните его с сохраненным хешированным паролем в вашей базе данных. Это может устранить проблему с кодировкой.

0 голосов
/ 14 апреля 2010

Если вы хотите хранить пароли, прочитайте это: Что вам нужно знать о схемах безопасных паролей .

После прочтения ваша корневая проблема, похоже, заключается в некотором несоответствии кодировки символов между тем, что вы получаете от пользователя, и тем, что вы получаете из базы данных. Если вы используете кодировку Mysql и utf-8, сначала вы используете запрос SET names "utf-8"?

...