2011-12-28 4 views
1

Я не могу найти подходящий способ работы с паролями в PHP. Я хэширование и с использованием соли, когда дело доходит до хранения, но я пытаюсь получить базовый пароль внизPHP: пароли со специальными символами

stripslashes(mysql_real_escape_string($_POST["password"])); 

Я предполагаю, что некоторые пользователи будут использовать пароли с «! @ # $% ^. .. "и т. д. Я могу представить себе пользователей, использующих пароль, например <b>lulz</b>"u'mad?.

Как включить эти специальные символы в свою переменную пароля?

+2

Я бы не использовал stripslashes для любых данных, которые не будут повторно выводиться как HTML. –

+5

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

+2

Вам не нужно делать что-либо * на вкладке, прежде чем вы его сделаете. –

ответ

5

Вам не нужно делать каких-либо выходов или зачистки здесь. * Просто что-то вроде $hashed = my_favourite_hash($_POST["password"] . $salt) должно быть хорошо. Любая разумная функция хэширования должна возвращать строку буквенно-цифровых символов, ни одна из которых не требует экранирования.

Во всяком случае, вы должны использовать подготовленные заявления для запросов SQL, так что нет никакой возможности SQL инъекций и т.д.


* Если предположить, что у вас нет magic quotes включен (и вы действительно не должны» т!).

† Замените предпочтительную функцию хеша для my_favourite_hash здесь.

+3

Я предполагаю, что подтекст должен был отвратить "{hash_algo} небезопасно!" типа комментарии. Хороший вызов :) –

+2

Точка stripslashes() и mysql_real_escape_string() должна убедиться, что вы ничего не передаете своим запросам, которые могут быть приняты за что-то другое, кроме данных. Хеширование должно превращать все, что вы отправляете, в строго строковые данные. – Chris

+1

@Madmartigan: Да, я буду защищать этот ответ ... –

3

Хранение пароля в текстовом формате крайне вредно. Вместо этого вы должны сохранить хэш этого пароля в базе данных. Если пароль хэширован, для символов, которые он может содержать, ограничений не существует.

Чтобы создать указанный хеш, я рекомендовал бы использовать функцию crypt(). Предпочтительно использовать алгоритм SHA512 или BLOWFISH.

Кроме того, я бы рекомендовал вам, чтобы прекратить использование древних mysql_* функций (которые находятся в процессе устаревшее) и узнать, как использовать PDO или MySQLi с подготовленными операторами.

Смежные вопросы