原文链接:http://drupal.org/node/178896
跨站点请求伪造(CSRF或者XSRF)是一个对一个站点发送请求执行用户不打算执行的动作的进程。有很多种方法都可以实现,但是Drupal以很简单的方式来防止这种攻击。
HTTP 1.1规范做了明确的区分,在网站中POST请求可以修改数据而GET请求不可以修改数据。模块修改数据需要POST请求。
在Drupal
SA-2007-017以前的版本可能创建一个页面,该页面包含图像标记,像"src"元素链接到某些菜单禁用url的Drupal站点。如果网站的管理员访问那个页面当他们登录到站点他们的浏览器将请求URL菜单禁用页面将禁用他们的菜单项。
Drupal防止CSRF
Drupal的
Form API提供了防止CSRF在form中自动添加使用特殊tokens的方法。如果你的模块使用Form API的所有请求修改数据如果你适当的遵守Form API 文档那么你的模块是抵御CSRF的。
糟糕的代码
糟糕的代码有两种形式:
1.直接使用$_POST变量和通过HTML创建而不是Drupal的Form API
2.使用一个链接和菜单回调处理action修改数据
你能可以在Drupal Core CSRF vulnerabilities fixed in 5.2中看到"糟糕代码的例子"和怎样修复它。
好代码
见
Forms API文档
例子
如果你发现你有菜单回调那是易受CSRF攻击的,最简单的解决方法是通过 confirm_form()为每个菜单回调添加一个确认。Drupal为你做了大部分的工作。例子如下:
http://api.drupal.org/api/function/forum_confirm_delete/6
http://api.drupal.org/api/function/forum_confirm_delete_submit/6
你可以使用drupal_get_token()和drupal_valid_token()生成token可以使用常规的链接。然而,通常不这样做,而且当链接的结果将修改数据时不应当使用。drupal_get_token的相关用法的例子见:
http://api.drupal.org/api/function/update_info_page/6
有用的链接:
Wikipedia description of CSRF