繁体   English   中英

安全主题-TWIG中的is_granted(ROLE_ADMIN)是否足够?

[英]Security Topic - IS is_granted(ROLE_ADMIN) in TWIG enough?

我想知道在树枝中仅执行is_granted(ROLE_ADMIN)是否足以保护表单。

我的意思是任何人都可以使用该表格:
-带有选择选项的一些小部件可供任何人更改。
-仅在授予ROLE_ADMIN的情况下,才会显示其他窗口小部件(有关管理的窗口小部件)。

仅通过ROLE_ADMIN更改这种形式的管理内容就足够安全了吗? 还是我也应该固定控制器。

(确保控制器安全将使我编写更多内容,因为现在只需要执行flush()即可。然后,我将对通过表单请求获得的所有POST进行更多测试)

一般建议

这取决于您所说的安全性 而且,这也取决于您对安全性的定义是否足够

以下问题可能会有所帮助:

  • 它是内部使用的应用程序(例如公司内部的日历应用程序,其中没有存储或公开敏感数据)
  • 确保针对故意格式错误的请求的安全性是否重要(我会在每次第一个问题的答案为“是”时都会考虑)。 但是,即使前一个问题的答案为“否”,有时即使在内部日历应用程序中,您也会有格式错误的请求……这全都取决于您认为什么是安全威胁,而哪些不是。 并且,对您的用户。

如果您没有在控制器中保护它,则用户可能会提交一个任意的POST请求,其中包含未在其中显示的字段,如果她正确猜测了字段的名称或在某个地方找到了它们。 因此,我认为,您应该始终仔细检查其是否理智。

你可以:

  • (“纯”解决方案,更耗时)通过根据用户权限动态生成表单类型来分隔管理窗口小部件。 然后,您始终可以在生成HTML之前在Twig中检查它们的存在。 如果您不使用FormType,那么我建议您这样做-但即使您在控制器中构建整个表单,也可以动态添加字段。
  • (“肮脏”的解决方案,但易于实现且易于实现)在控制器中处理表单提交时(您建议)检查该角色。

并在评论中回答您的问题:“如何模拟POST以检查令牌是否足以阻止POST字段,而这些字段实际上并未显示在我的页面中。” 如果您使用Google Chrome进行开发,我可以向您推荐Chrome Advanced Rest Client扩展。 我用它来成功测试我的表格。

因此,总而言之,我认为这个问题并未明确提出,也无法普遍回答。 一切取决于。 但是,如果您想得到一个简单的答案:它不够安全。 隐藏某人的东西并不表示它是安全的。 因此...

具体建议-带有表单事件监听器的解决方案

这就是我为达到最大安全性的方式(我在这里使用PHP 5.5,因此请确保您拥有它,或者需要进行一些语法调整)。

在您的FormType ,注册一个事件侦听器,例如:

(...)

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('product_id', 'hidden');

    (...)

    $dynamicFieldCreatorFunc = function (FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if ($this->getContainer()->get('security.context')->isGranted('ROLE_ADMIN'))
        {
            $form->add('admin_field', 'choice', [
                'choices' => [1 => 'Choice 1', 2 => 'Choice 2'],
            ]);
        }
    };

    $builder->addEventListener(FormEvents::PRE_SET_DATA, $dynamicFieldCreatorFunc);
    $builder->addEventListener(FormEvents::PRE_SUBMIT, $dynamicFieldCreatorFunc);
}

然后,如果用户不是管理员,则您的表单将不会生成这些字段。 当然,在Twig中,如果您逐一渲染小部件,则应在渲染它们之前检查该字段的存在:

{% if form.admin_field is defined %}
    {{ form_widget(form.admin_field) }}
{% endif %}

或者,在最新的Twig中使用较短的语法

{% form.admin_field is defined ? form_widget(form.admin_field) }}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM