是否可以在symfony 2.3中使用基本数学安全性防止表单攻击


Is it possible to prevent Form Attacks with Basic Math Security in symfony 2.3?

我正在寻找一种解决方案,以便在Symfony 2.3下实现基本的数学安全问题。

我在这里找到了一篇文章:使用基本数学安全性防止表单攻击,其中解释了一个简单的php解决方案。

如何在Symfony中创建自定义表单字段和"数学安全问题"的自定义验证?

我知道验证码是一个更好的解决方案,但是...这些是项目约束。

是的,你可以这样做。此外,从技术上讲,数学挑战CAPTCHA - 它不是典型的字母加扰式CAPTCHA。

"如何"有点复杂,对于SO帖子来说可能是一个太宽泛的主题,但我可以提供一些有用的链接

首先,熟悉创建自定义表单/字段类型

http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html

接下来,研究 Symfony2 中现有的 CAPTCHA 实现 - 看看值是如何生成的,如何在会话中持久化,然后进行验证

https://github.com/Gregwar/CaptchaBundle

祝你好运!

我建议使用"genemu"捆绑包。但是我需要在 FormType 中快速实现一个基本的"安全问题"(不是 100% 可靠的)它应该使用约束和回调,但我没有时间重构。

public function buildForm(FormBuilderInterface $builder, array $options)
{
  // Map -> question/answer
  $securityMap = array(
        'a' => array(
                'q' => '1+1=?',
                'a' => '2'
            ),
        'b' => array(
                'q' => 'Are you human?',
                'a' => 'yes'
            ),
        'c' => array(
                'q' => 'What is the color of an orange?',
                'a' => 'orange'
        )
    );
  ...
  // Post validation (should use Contraint)
  $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($securityMap) {
        $form = $event->getForm();
        $question  = $form['sec_map']->getData();
        $answer = $securityMap[$question]['a'];
        if($form && $form['sec']->getData() !== $answer ){
            // This trigger a global form error and not an error on the field..
            $form->addError(new FormError('Bad Answer'));
        }
    });
  ...
  // Pick a question
  $rand_key = array_rand($securityMap);
  // Question (key) added in form and will be POST
  $builder->add('sec_map', 'hidden', array('data' => $rand_key, 'mapped' => false) );
  $builder->add('sec', 'text', array(
        'label' => 'Please answer: ' . $securityMap[$rand_key]['q'], 
        'mapped' => false
    ));
}