Данные Symfony 2 из формы $ _POST экранированы - ИСПРАВЛЕНО - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть форма Symfony 2, которая отправляет данные для смены пароля пользователей.Однако во время тестирования я обнаружил, что некоторые символы, введенные в поле пароля, экранируются при попадании в валидатор.

Пример:

Пользователь вводит пароль, такой как RzB&EUgbrhqJRt$Y2

В валидаторе этозначение становится RzB&EUgbrhqJRt$Y2

Обратите внимание, что & сбежал до &

Это просто нарушает некоторые из моих правил проверки.Я не мог найти, почему и как отключить эту экранирующую вещь.Совершенно новичок в Symfony и ищет помощь по этому вопросу.

Код формы сборки:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('currentPassword', PasswordType::class, [
            'constraints' => new UserPassword(['groups' => [UserProfile::VALIDATION_PASSWORD], 'message' => 'Current password is invalid.']),
            'mapped' => false,
            'attr' => [
                'placeholder' => 'Current Login Password',
                'required' => 'true',
                'data-parsley-required-message' => 'Please enter your current login password',
                'autocomplete' => 'disabled'
            ]
        ]);

        $builder->add(self::FORM_NEW_PASSWORD, RepeatedType::class, [
            'type' => PasswordType::class,
            'mapped' => false,
            'constraints' => [
                new NewPassword(['groups' => [UserProfile::VALIDATION_PASSWORD]])
            ],
            'first_options' => [
                'attr' => [
                    'id' => 'change_password_newPassword_first',
                    'maxlength' => 40,
                    'minlength' => 10,
                    'data-parsley-password' => '',
                    'placeholder' => 'New Password',
                    'data-parsley-required-message' => 'Please enter your new password',
                    'autocomplete' => 'disabled'
                ]
            ],
            'second_options' => [
                'attr' => [
                    'data-parsley-equalto' => '#change_password_newPassword_first',
                    'placeholder' => 'Confirm New Password',
                    'data-parsley-required-message' => 'Please re-enter your new password',
                    'autocomplete' => 'disabled'
                ]
            ]
        ]);

        $builder->add('change', SubmitType::class, [
            'attr' => [
                'class' => 'btn-full-width',
                'data-parsley-validate' => 1,
                'disabled' => 'disabled'
            ]
        ]);

        $builder->addEventListener(FormEvents::POST_SUBMIT, [$this, 'onPostSubmit']);
    }

Ограничение проверки формы:

    public function validate($value, Constraint $constraint) 
        {
            //$value HERE IS ESCAPED
            $zxcvbn = new Zxcvbn();
            $strength = $zxcvbn->passwordStrength($value);

            $pp = new PwnedPasswords();
            if (!preg_match(NewPassword::REGEX, $value)) {
                // Match password pattern
                $this->context->buildViolation($constraint->messagePasswordNotValid)
                    ->setParameter('{{ value }}', $this->formatValue($value))
                    ->addViolation();
            } else if ($strength["score"] < 3) {
                // Calculate password strength
                $this->context->buildViolation($constraint->messagePasswordNotStrong)
                    ->setParameter('{{ value }}', $this->formatValue($value))
                    ->addViolation();
            } else if ($pp->isInsecure($value)) {
                // Check to see if the password is breached
                $this->context->buildViolation($constraint->messagePasswordBreached)
                    ->setParameter('{{ value }}', $this->formatValue($value))
                    ->addViolation();
            }
        }

ИСПРАВЛЕНО:

Проблема, вызванная html_purifier_extension в конфигурации форм.Отключение, которое решило проблему.Хотя extended_type: Symfony\Component\Form\Extension\Core\Type\TextType, не уверен, почему это повлияло и на поле пароля.Нужно расследовать больше.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Я думаю, что Мухаммед был прав, предложив использовать htmlspecialchars_decode($value);.

И когда кто-то использует &amp; в своем пароле, например,

Zdv5&amp;rwv)

, $value, который получит валидатор, будет иметь знак & в кодировке &amp;на &amp;, что делает его &amp;amp;, поэтому весь пароль в конечном итоге будет

Zdv5&amp;amp;rwv)

Проверьте здесь для примера кода.

0 голосов
/ 04 апреля 2019

Это может быть причиной: не htmlspecialchars() данные, которые вы не отражаете.Это может быть причиной.htmlspecialchars() используется для очистки данных, которые вы будете печатать в HTML-парсере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...