如何通过树枝和symfony安全地发送表格?

时间:2019-04-11 13:32:26

标签: symfony twig

我想知道是否存在任何方法可以让您发送加密的数据,例如通过视图和控制器。 假设您有一个带有以下字段的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 :(得分:0)

首先,我不是安全专家。但是既然您在摸索一些基础知识...

在letencrypt时代,未加密的连接确实没有任何借口! (真的!特别是对于登录表单...)。这很重要,symfony不能为您照顾。

最好的第一道防线是加密连接。这样可以防止任何人监听连接(以及通过表单发送的密码...)

保护“纯文本”密码,当密码到达您的服务器,最后到达symfony和您的控制器时,我不得不说...如果您不信任服务器,则不应信任任何内容。

如果您使用登录/注册表格停留在标准地区,则不会有任何问题。平均而言,由非安全开发人员(包括我自己)进行的“自定义安全”会造成安全风险。

我会有点自大,并假设您是新手(一点都不打算冒犯),并建议您保持简单,遵循教程,从而保持安全。对于常见的安全用例,symfony的默认值已经足够好了。

此外,symfony通常应该获取数据并管理登录内容,以便您不会搞砸它。阅读how to build a login form。 (例如,登录字段的“魔术”名称)。

也许还有关于如何处理用户注册和密码更改的教程。 (平均而言,我宁愿相信symfony页面上的教程)。注册和密码更改不受保护登录名的相同机制的保护。

您还写:

  

第一个请求将包含一个没有任何加密的纯密码,该密码将从视图传输到控制器。

首先:否。不会将任何普通密码从视图传输到控制器。我不想赘述过多,但是您的视图仅获取您在控制器中显式提供的数据。因此,它已从symfony框架通过处理安全性和其他奇特事物*的多层服务转移到 controller 。然后可以做的事情,它还应该创建一个响应(例如,通过渲染视图),然后返回响应(再次使用symfony会将其推送到用户的某些服务层)。

*)如果您安装了可以添加事件侦听器的捆绑软件/软件包,那么从理论上讲,这些捆绑软件/软件包可以在安全性开始之前拦截请求。因此,请勿盲目安装软件包。