Base64_encode странное поведение

Я делаю примерно следующее:

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], они такие же, но все равно ошибка. Что я делаю не так? Спасибо

Пожалуйста, предоставьте некоторую информацию о том, что на самом деле содержат $ myrow и $ _POST (var_dump ($ myrow); и var_dump ($ _ POST);)

Stefan Gehrig 18.10.2008 00:19

var_dump ($ somepass); var_dump ($ myrow); и вставьте результат в свой вопрос.

Paul Dixon 18.10.2008 00:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
387
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Попробуйте использовать 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 (), я получу:

строка (40) "YWRraM2 =" строка (8) "YWRraM2 ="

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

myplacedk: есть ли причина, по которой мне не следует этого делать? Я думал, это добавит дополнительный уровень безопасности?

Какая база данных? Какой тип столбца вы используете для поля пароля?

Stefan Gehrig 18.10.2008 00:34

Обратимая функция ничем не лучше обычного текста. Вместо этого вы можете изучить функцию crypt (): php.net/crypt

Powerlord 18.10.2008 00:34

Эта кодировка выполняет две функции:

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

Так что нет, на самом деле это не добавляет безопасности. Это просто кодировка, расшифровать несложно.

Может быть, вы принимаете это за хеширование md5 или что-то в этом роде.

Играть - это здорово, но когда дело касается безопасности, я действительно рекомендую не использовать то, чего вы не понимаете. В конечном итоге это принесет больше вреда, чем пользы.

Некоторые вопросы:

  • Из ваших комментариев в другом месте я предполагаю, что проблема с текущим кодом в том, что поле вашей базы данных - CHAR (40). Поле CHAR всегда имеет фиксированный размер. Попробуйте изменить тип поля базы данных на VARCHAR вместо CHAR.

  • Использование base64_encode перед сохранением в базе данных далеко не безопасно. Хорошая практика - хранить в базе данных только односторонний хэш пароля - обычно md5 или (лучше) sha1. Затем, когда пользователь хочет войти в систему, используйте ту же хеш-функцию для предоставленного пароля, а затем сравните два хеша.
    Это дает дополнительное преимущество работы с паролями длиной более 40 символов. Sha1 или md5-hash всегда занимает фиксированное количество места, поэтому, если вы пойдете по этому маршруту, вам не нужно переключать столбец базы данных на VARCHAR :)

Другие вопросы по теме