я не могу войти с помощью password_verify в MVC [duplicate]

немного не по теме (с использованием CLI вместо PHP), но все же стоит знать: вы можете установить приглашение для отображения базы данных по умолчанию, используя любой из следующих

mysql --prompt='\d> '
export MYSQL_PS1='\d> '

или один раз внутри

prompt \d>\_
\R \d>\_
76
задан Taryn 22 March 2017 в 17:26
поделиться

2 ответа

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

Вы будете спорить (и вы видите это в каждом сообщении, в котором пользовательские данные принимаются для использования в ваших системах), что мы должны очищать все пользовательские данные, и вы были бы правы для любую другую информацию, которую мы принимаем от наших пользователей. Пароли разные. Хэшированные пароли не могут предложить угрозу SQL-инъекции, потому что строка переводится в хеш до хранения в базе данных.

Актом хэширования пароля является принятие пароля для сохранения в вашей базе данных. Хэш-функция не имеет особого значения для каких-либо байтов, поэтому для обеспечения безопасности не требуется очистка ее ввода

Если вы следуете мантрам, позволяющим пользователям использовать пароли / фразы , и вы не ограничиваете пароли , позволяя любую длину, любое количество пробелов и хэширование любых специальных символов делают пароль / парольную фразу безопасной независимо от того, что содержится в пароле. На данный момент наиболее распространенный хеш (по умолчанию), PASSWORD_BCRYPT , превращает пароль в строку шириной 60 символов, содержащую случайную соль, вместе с информацией хешированного пароля и стоимостью (алгоритмическая стоимость создания хэша):

PASSWORD_BCRYPT используется для создания новых хэшей паролей с использованием алгоритма CRYPT_BLOWFISH. Это всегда будет приводить к хеш-файлу с использованием формата склепа «$ 2y $», который всегда имеет ширину 60 символов.

Требования к пространству для хранения хеша могут быть изменены как различные методы хэширования добавляются к функции, поэтому всегда лучше увеличить размер столбца для сохраненного хэша, например VARCHAR(255) или TEXT.

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

SELECT * FROM `users`;

Может быть хэширован до $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G

. Посмотрим, как различные методы санитарии влияют на пароль -

Пароль - I'm a "dessert topping" & a <floor wax>! (В конце пароля есть 5 пробелов, которые здесь не отображаются).

Когда мы применяем следующие методы обрезки, мы получаем некоторые дикие разные Результаты:

var_dump(trim($_POST['upassword']));
var_dump(htmlentities($_POST['upassword']));
var_dump(htmlspecialchars($_POST['upassword']));
var_dump(addslashes($_POST['upassword']));
var_dump(strip_tags($_POST['upassword']));

Результаты:

string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing
string(65) "I'm a &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // double quotes, ampersand and braces have been changed
string(65) "I'm a &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // same here
string(48) "I\'m a \"dessert topping\" & a <floor wax>!     " // escape characters have been added
string(34) "I'm a "dessert topping" & a !     " // looks like we have something missing

Что происходит, когда мы отправляем их в password_hash()? Все они получают хеширование, как и запрос выше. Проблема возникает при попытке проверить пароль. Если мы используем один или несколько из этих методов, мы должны повторно использовать их до их сравнения с password_verify() . Не удалось выполнить следующее:

password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query

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


Использование версии PHP менее 5.5? Вы можете использовать пакет совместимости password_hash() .

Вам действительно не следует использовать хэш-коды MD5 .

88
ответ дан Community 16 August 2018 в 01:24
поделиться
  • 1
    Нет. Если он создал свой пароль с завершающими пробелами, что разрешено, он должен использовать их при входе в систему @DanBracuk – Jay Blanchard 14 April 2016 в 16:19
  • 2
    Как это @DanBracuk? Если мы разрешаем пользователю устанавливать пароль, который он желает, включая начальные / конечные пробелы? – Jay Blanchard 14 April 2016 в 16:22
  • 3
    Вот почему большинство вещей требует, чтобы вы дважды вводили свой выбранный пароль. Если пользователь добавит пробелы в случае аварии, они выяснят это, прежде чем продолжить. Если пользователь сделал это специально, а не без проблем. – Occam's Razor 14 April 2016 в 16:24
  • 4
    @MargaretBloom, эмпирическое правило - это просто эвристика. Иногда нам еще нужно продумать все, как для паролей. Вы говорите, что «никто не знает, как все изменится в будущем», но похоже, что что-то изменится, так как мы избегаем данных, прежде чем мы поместим их в базу данных, и в каких случаях пользователи будут заблокированы, когда их пароли больше не соответствуют тому, что мы сохранили. В чем опасность не избежать хэшей паролей против опасности их побега? – DavidS 14 April 2016 в 23:05
  • 5
    Точно: вы, конечно, «избегаете хеширования». в ограниченном смысле правильно передать его в параметризованный SQL-запрос, где какой-то код в вашем SQL-коннекторе может или не может с ним что-либо делать, что соответствует «экранированию», вы не знаете и не заботитесь. Вам просто не нужно писать какой-либо конкретный код, чтобы достичь этого, потому что он полностью рутин для всех ваших SQL-запросов, если вы ранее не принимали некоторые плохие жизненные решения. – Steve Jessop 14 April 2016 в 23:25

Прежде чем перевести пароль, вы должны нормализовать его, как описано в разделе раздела 4 документа RFC 7613 . В частности:

  1. Дополнительное правило сопоставления: любые экземпляры пространства без ASCII ДОЛЖНЫ отображаться в пространстве ASCII (U + 0020); пространство без ASCII представляет собой любую кодовую точку Юникода, имеющую общую категорию Unicode «Zs» (за исключением U + 0020).

и:

  1. Правило нормализации: Форма нормализации Unicode C (NFC) ДОЛЖНА применяться ко всем символам.

Это пытается гарантировать, что если пользователь вводит тот же пароль, но с использованием другого метода ввода, пароль все равно должен быть принят.

31
ответ дан Ali 16 August 2018 в 01:24
поделиться
  • 1
    @DavidS, супер блестящая североамериканская книга Mac (которую Джо использовал как раз перед отъездом), и плохо интернационализированный тайваньский компьютер интернет-кафе (который Джо пытается использовать для загрузки, это карта заднего борта). – Margaret Bloom 14 April 2016 в 22:15
  • 2
    Звучит смехотворно. :-) Спасибо хоть. – DavidS 14 April 2016 в 22:46
  • 3
    Хм. Если вы это сделаете, вы также должны проверить пароли, чтобы отклонить любые, которые содержат еще не присвоенные символы. Было бы ужасно, если бы пользователь использовал NEWFANGLED SPACE, которое ваше приложение не распознает и, следовательно, хеширует как есть, а затем обновляет вашу базу данных символов Юникода и неожиданно NEWFANGLED SPACE получает сопоставление с пробелом перед хэшированием, таким образом, больше не может вводить пароль, который ваше приложение будет использовать для старого хэша. – ruakh 14 April 2016 в 22:46
  • 4
    @JayBlanchard Потому что, когда вы нажимаете пробел на одной машине, и когда вы нажимаете ее на другой машине, вы можете получить два разных кодовых пункта Unicode, и они будут иметь два разных кодировки UTF-8, без того, чтобы пользователь ничего не знал. Можно утверждать, что это проблема, которую вы хотите игнорировать, но RFC 7613 был подтвержден такими актуальными проблемами, это не рекомендация по работе. – Kuba Ober 27 April 2016 в 20:03
  • 5
    @ruakh После того, как вы решите обработать пароли определенным образом, они должны оставаться обработанными таким образом, иначе все будет нарушено для существующих случаев использования. Если вы намерены изменить метод предварительной обработки в будущем, вы должны сохранить его вдоль предварительно обработанного и хешированного представления пароля. Таким образом, после получения ввода вы выбираете метод предварительной обработки / хеширования на основе того, с чем вы сравниваете. – Kuba Ober 27 April 2016 в 20:06
Другие вопросы по тегам:

Похожие вопросы: