FOSUserBundle, пароль (plainPassword) не шифруются при отправке формы POST

В моем проекте Symfony я использую пользовательский пакет FOS.

В моем secutity.yml у меня есть это, чтобы использовать кодировщик bcrypt:

security:
    # FOS UserBundle needles
    encoders:
        Symfony\Component\Security\Core\User\User: bcrypt
        MyNamespace\MyBundle\Entity\User: bcrypt
        FOS\UserBundle\Model\UserInterface: bcrypt

Я вызываю форму регистрации пользователя fos во встроенной форме следующим образом:

$builder
  ->add('contactPhone')
  ->add('contactMobilePhone')
  ->add('user', 'fos_user_registration', array(
                                               'label' => false,
      ))

Например, он отображает следующее: введите здесь описание изображения

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

Поэтому я могу восстановить все данные моего запроса POST в браузере консоли:

my_form[user][email][email protected]

my_form[contactPhone]=0404040404

my_form[contactMobilePhone]=0606060606

my_form[user][username]=test

my_form[user][plainPassword][first]=test // ввод первого пароля

my_form[user][plainPassword][second]=test // проверка

my_form[save] // отправить my_form[_token_consumer]=// не нужно его видеть

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

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


person french_dev    schedule 15.02.2016    source источник


Ответы (2)


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

Сами данные формы не должны содержать никакого шифрования. Как только вы отправляете данные формы на сервер, данные становятся зашифрованными. Чтобы правильно зашифровать ввод use, на сервер должны быть отправлены простые значения. Если вы выполнили какое-либо «предварительное шифрование», вам нужно будет изменить поток вашего процесса регистрации, чтобы проверить хэш и разрешить его вставку в базу данных, но это не рекомендуется.

Если вы беспокоитесь о том, что кто-то другой использует эти данные для проведения XSS-атак, то CORS/CSRF — это то, что вам нужно настроить, чтобы решить эту проблему.

Почему я говорю, что ваша текущая проблема не является проблемой? Что ж, если вы зайдете практически на любой сайт с регистрационной формой и отправите ее, вы увидите открытый пароль в параметрах запроса, как это обычно бывает. Facebook и Google отправляют открытый текстовый пароль при входе/регистрации. Почему? Потому что это нормальное и ожидаемое поведение.

person 0xMatt    schedule 15.02.2016
comment
будьте уверены, что в моей БД пароли закодированы и зашифрованы с помощью bcrypt, и мое приложение позже будет на https-сервере. Я искал, чтобы убедиться, что мой код безопасен и нормально ли такое поведение браузера. - person french_dev; 15.02.2016
comment
Я думаю, что мой ответ объясняет, как/почему это нормально. Я не упомянул SSL, так как это не входило в ваш вопрос. Если это ответ на ваш вопрос, пожалуйста, отметьте его как таковой. Если нет, объясните, какая дополнительная информация необходима. - person 0xMatt; 15.02.2016

Все данные, отправленные через http-соединение, могут быть видны кому-то на вашем пути к серверу (атака «человек посередине»).

type="password" только скрывает символ на экране, и даже другие программы на вашем компьютере могут считывать данные.

Единственный способ защитить данные — отправить их через SSL (HTTPS вместо HTTP).

person Puya Sarmidani    schedule 15.02.2016
comment
http://symfony.com/doc/current/cookbook/security/force_https.html поможет тебе в этом - person Puya Sarmidani; 15.02.2016
comment
спасибо за вашу ссылку и силу https, я ищу что-то подобное, я попробую ваше предложение! - person french_dev; 16.02.2016
comment
Вы должны использовать шифрование TLS (HTTPS), потому что в SSL есть известная ошибка, и оно будет объявлено устаревшим. - person fcpauldiaz; 17.02.2016