0

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

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

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

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

4

2 回答 2

0

是的,你可以这样做。此外,从技术上讲,数学挑战一种验证码——它不是典型的字母争夺式验证码。

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

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

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

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

https://github.com/Gregwar/CaptchaBundle

祝你好运!

于 2013-10-28T14:54:59.443 回答
0

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

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
    ));
}
于 2014-10-20T21:36:29.617 回答