Как безопасно отправить форму через Twig & Symfony? - PullRequest
0 голосов
/ 11 апреля 2019

Мне интересно, существует ли какой-либо метод, который позволяет отправлять данные в зашифрованном виде, например, через представление и контроллер. Представьте, что у вас есть TypeForm со следующими полями: enter image description here

  • Пользователь запросит представление, контроллер ответит на пользователь с этим видом (форма).
  • Пользователь отправляет свои данные через форму
  • Пользовательские данные будут обработаны в контроллере и будут сохранены в базе данных через модель.

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

Например, сертификат HTTPS будет шифровать весь канал связи. Есть какие-нибудь хитрости, которые позволят вам сделать что-то связанное с этим?

Примеры: это может быть TypeForm:

    <?php
namespace App\Form;
use App\Entity\User;
use App\Entity\Profile;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Validator\Constraints\IsTrue;
class RecoveryPasswordType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('plainPassword', RepeatedType::class, array(
                'type' => PasswordType::class,
                'first_options'  => array( 'label' => 'Password', 'attr' => array( 'class' => 'form-control repeat', 'placeholder' => 'Password')),
                'second_options' => array( 'label' => 'Repeat Password', 'attr' => array( 'class' => 'form-control', 'placeholder' => 'Repeat password')),
            ))
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
        ]);
    }
}

а этот холодный будет вид

 {% extends 'base.html.twig' %}

{% block body %}
    {{ form_start(form, { 'attr': {'class': 'form-signin disabled'} }) }}
    {{ form_row(form.plainPassword.first, {'label':false}) }}
    {{ form_row(form.plainPassword.second, {'label':false}) }}
    <button class="btn btn-lg btn-primary btn-block" type="submit">Send</button>
{{ form_end(form) }}
{% endblock %}

С уважением.

1 Ответ

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

Прежде всего, я НЕ эксперт по безопасности.Но так как вы царапаете некоторые основы ...

Во времена letsencrypt, нет никакого оправдания для незашифрованных соединений!(Действительно! Специально для формы входа ...).Это большая вещь, о которой Symfony не может позаботиться о вас.

Лучшая первая линия защиты - это зашифрованное соединение.Это должно помешать любому прослушивать соединение (и пароли отправляются через формы ...)

Защита пароля в виде открытого текста, когда он достигает вашего сервера и, наконец, Symfony и вашего контроллера, я должен сказать ..Если вы не доверяете серверу, вы не должны ничего доверять ему.

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

Я буду немного высокомерен и предположу, что вы новичок (без обид.на все), и советую вам быть простым, следовать инструкциям и, таким образом, оставаться на безопасной стороне.Значения по умолчанию Symfony достаточно хороши для обычного безопасного варианта использования.

Кроме того, Symfony обычно должен собирать данные и управлять содержимым входа в систему, чтобы вы не могли его испортить.Прочтите , как создать форму для входа .(например, «волшебные» имена для полей входа в систему).

Возможно, существуют также учебные пособия по обработке регистрации пользователя и смены пароля.(Я бы предпочел доверять учебникам на странице Symfony, в среднем).Регистрация и смена пароля не защищены теми же механизмами, которые защищают вход в систему.

Вы также пишете:

Первый запрос будет содержать простой пароль без какого-либо шифрования, который будет передан из представления в контроллер.

Прежде всего: Нет. Никакие простые пароли не будут переданы из вида в контроллер.Я не хочу вдаваться в подробности, но ваше представление получает только те данные, которые вы явно предоставляете в своих контроллерах.Таким образом, он переносится из среды Symfony через несколько уровней сервисов, обеспечивающих безопасность и другие причудливые вещи *, в контроллер .Который затем может что-то делать, он должен также создать ответ - например, путем рендеринга представления - и затем вернуть ответ (Symfony снова протолкнет его через несколько уровней сервисов пользователю).

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

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