Вопрос

Я делаю что-то вроде следующего:

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 :)

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top