作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
一个网站用户B可能正在浏览聊天论坛,而同时另一个用户A也在此论坛中,并且后者刚刚发布了一个具有B银行链接的图片消息。设想一下,A编写了一个在B的银行站点上进行取款的form提交的链接,并将此链接作为图片的src属性。如果B的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当B的浏览器尝试装载图片时,就会提交这个取款form和他的cookie,这样在没经B同意的情况下便授权了这次事务。
在Drupal5.2以前,是存在CSRF安全漏洞,http://drupal.org/node/162360,在此以后,只要遵守Drupal表单API规范,便可以杜绝此类攻击。
Drupal表单API遵循HTTP/1.1规范,GET方法用于数据检索,除此以外不对数据作任何改动。如果需要对服务器进行改动,在Drupal中应该使用POST。
其次,表单API带有令牌和标识ID,从而确保从POST请求中提交的表单数据来自于Drupal生成的表单。当你编写模块时,对于你的表单,一定要为其使用表单API,这样你就能够自动的获得保护。在你的模块中,对表单输入结果进行的任何操作,都应该放到该表单的提交函数中。
我们在实践中,需要避免两种情况:
1, 直接使用$_POST,并且使用html方式构建表单(绕过Drupal的表单API)。
2, 使用菜单回调直接处理修改数据的动作。
对于前者,我们采用表单API既可,对于后者,我们也需要采用表单API,此时使用confirm_form(),在执行数据操作前,先确认一下。