Вопрос
Я делаю что-то вроде следующего:
SELECT * FROM table WHERE user='$user';
$myrow = fetchRow() // previously I inserted a pass to the db using base64_encode ex: WRM2gt3R=
$somepass = base64_encode($_POST['password']);
if($myrow[1] != $somepass) echo 'error';
else echo 'welcome';
Я всегда получаю ошибку, я даже повторяю $ somepass и $ myrow [1] они одинаковые, но все равно ошибка.Что я делаю не так?Спасибо
Решение
Попробуйте использовать var_dump
вместо echo - возможно, у одного из них есть пробел или перевод строки в начале / конце.
Редактировать:
Вы, должно быть, сохраняете его как CHAR(40): A fixed-length string that is always right-padded with spaces to the specified length when stored
Используйте VARCHAR или trim()
Другие советы
Если $ myrow [1] на самом деле правильный пароль в base64-кодировке, я не вижу никаких ошибок.
Попробуйте это до конца.
echo "<br />$myrow[1] != $somepass";
Что это говорит?
И, кстати: я не вижу причин для кодирования паролем base64. Что вы пытаетесь достичь?
Я думаю, что если я сделаю var_dump (), я получу:
string (40) " YWRraM2 = " строка (8) "YWRraM2 ="
кажется каким-то образом, если я вставляю данные в базу данных с помощью консоли, это добавляет дополнительный пробел в поле pass.
myplacedk: есть ли причина, почему я не должен это делать? Я думал, что это добавит дополнительный уровень безопасности?
Эта кодировка выполняет две функции:
<Ол>Так что нет, это не добавляет безопасности. Это просто кодировка, ее легко декодировать.
Возможно, вы ошибочно принимаете его за хеширование md5 или что-то в этом роде.
Игра - это здорово, но когда дело доходит до безопасности, я действительно рекомендую не использовать то, что вы не понимаете. В долгосрочной перспективе это принесет больше урона, чем пользы.
Некоторые проблемы:
-
Судя по вашим комментариям в другом месте, я предполагаю, что проблема с текущим кодом заключается в том, что ваше поле базы данных равно CHAR (40).Поле СИМВОЛА всегда имеет фиксированный размер.Попробуйте изменить тип поля базы данных на VARCHAR вместо CHAR.
-
Использование base64_encode перед сохранением в базе данных далеко не безопасно.Хорошей практикой является хранение в базе данных только одностороннего хэша пароля - обычно md5 или (лучше) sha1.Затем, когда пользователь захочет войти в систему, используйте ту же хэш-функцию для предоставленного пароля, а затем сравните два хэша.
Это также дает дополнительное преимущество при работе с паролями длиной более 40 символов.
Хэш sha1 или md5 всегда занимает фиксированный объем пространства, поэтому, если вы пойдете по этому пути, вам не нужно переключать столбец базы данных на VARCHAR :)