老葛的Drupal培训班 Think in Drupal
假定你登录到了drupal.org,在里面浏览论坛中的内容。接着,由于其它原因,你转而浏览另一个网站。有人在该站点上不怀好意的放了一个图片标签:
<img src="http://drupal.org/some/path">
当你的浏览器加载该图片时,它将会对drupal.org请求该路径。由于你当前已经登录到了drupal.org,你的浏览器会在请求中把你的cookie也带上。现在就需要考虑一个问题了:当drupal.org收到这个请求时,它会把这个请求当作一个以登录的用户进行处理吗?你猜测它会!恶意用户的图片标签,以你的用户名点击了一个drupal.org上的链接。
首先,对于此类攻击,你要做的是永远不要使用GET请求来修改服务器上的东西;这样生成的任意请求都将无害。Drupal表单API遵循HTTP/1.1公约,GET方法除了数据检索以外不应采取任何行动。对于需要对服务器进行改动的动作,Drupal全部使用POST(参看http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1)。
其次,表单API使用令牌和标识ID,来确保从POST请求中提交的表单数据来自于Drupal生成的表单(更多详情,参看第10章)。当你编写模块时,对于你的表单,一定要为其使用表单API,这样你就能够自动的获得这一保护。在你的模块中,对表单输入结果进行的任何操作,都应该放到该表单的提交函数中。这样你就可以确保表单API对你进行了保护。
最后,如果需要的话,你还可以在URL中加个令牌(由drupal_get_token()生成)并使用drupal_valid_token()对令牌进行验证,来保护GET请求。