我正在寻找在 Symfony 2.3 下实现基本数学安全问题的解决方案。
我在这里找到了一篇文章:使用基本数学安全性防止表单攻击,其中解释了一个普通的 php 解决方案。
如何在 Symfony 中为“数学安全问题”创建自定义表单字段和自定义验证?
我知道验证码是一个更好的解决方案,但是......这些是项目限制。
我正在寻找在 Symfony 2.3 下实现基本数学安全问题的解决方案。
我在这里找到了一篇文章:使用基本数学安全性防止表单攻击,其中解释了一个普通的 php 解决方案。
如何在 Symfony 中为“数学安全问题”创建自定义表单字段和自定义验证?
我知道验证码是一个更好的解决方案,但是......这些是项目限制。
是的,你可以这样做。此外,从技术上讲,数学挑战是一种验证码——它不是典型的字母争夺式验证码。
“如何”有点复杂,对于 SO 帖子来说,主题可能过于宽泛,但我可以提供一些有用的链接
首先,熟悉创建自定义表单/字段类型
http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html
接下来,研究 Symfony2 中现有的 CAPTCHA 实现 - 看看值是如何生成的,在会话中持久化,然后验证
https://github.com/Gregwar/CaptchaBundle
祝你好运!
我建议使用“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
));
}