2009-04-15

CSRF使用注意事项和form的标准用法

类归于: symfony — 标签:, maker @ 13:17

我在<开启symfony的CSRF保护>一文中简单的介绍了CSRF的概念和使用方法, 由于那篇文章是学习symfony的初期写的, 所以对form和csrf理解的还不够透彻, 通过之后的学习和研究又渐渐的了解了一些细节.

首先, 在form被正确的应用的情况下, csrf是完全可以被兼容的, 这里先简单讲一下自定义的form的注意事项.

在定义form的时候, 我们需要定义名字格式, symfony自动生成的form应该已经设定了格式,不再需要重新设置

class CityForm extends BaseCityForm{
...
function setup()
{
...
$this->widgetSchema->setNameFormat('city[%s]');
...
}
...
}

这样我们将form中所有元素的值都放到了一个Parameter的子数组中.接下来在取得表单值的时候需要使用如下方法.

$this->form->bind($request->getParameter($this->form->getName()));
if($this->form->isValid()){
...
}else {
...
}

这样避免了手动构造bind的参数,也避免了在bind的参数中出现多余字段的问题,而且还可以完全兼容csrf,这也正是官方生成的代码所使用的方法。

本文完。

2008-12-22

开启symfony的CSRF保护

类归于: CentOS/Redhat, symfony — 标签:maker @ 14:48

什么是CSRF?

CSRF是伪造客户端请求的一种攻击,CSRF的英文全称是Cross Site Request Forgery,字面上的意思是跨站点伪造请求。

symfony 1.2中内置了CSRF验证功能, 用来防止CSRF攻击, 在建立项目的时候我们可以使用如下命令开启CSRF保护.

> symfony generate:app --csrf-secret=UniqueSecret frontend

或者修改app的settings.yml

all:
  csrf-secret=UniqueSecret

开启CSRF保护之后app中的所有form都会增加一个隐藏项, 其值为随机生成的一个字符串, 表单提交之后会对该字符串进行验证, 工作原理类似验证码, 但免去了输入验证码的麻烦.

为了更好的兼容性(这里指开启和不开启CSRF的时候都可以正常运行), 我们需要修改form取得值的方法, 使用

$form->bind($request->getPostParameters());

可能是CSRF相关的功能还没有足够的完善, 在之前的测试中, 当form的submit按钮有name的时候会产生表单错误, 造成表单无法提交, 如果非必要情况, 最好将submit的name设置为空或者不设置.

但有时候我们的确需要给submit一个name, 比如但表单多submit的情况. 这时我们就需要用另外一种方法了, 在form中加入下面代码.

$this->validatorSchema -> setOption('allow_extra_fileds', true);

这样表单验证会允许存在不属于form的field.

WordPress 所驱动