簡體   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