You are here

Drupal专业开发指南 第20章 表单API的安全性

g089h515r806 的头像
Submitted by g089h515r806 on 星期四, 2009-08-27 13:36

使用表单API的一个好处就是,它为你处理了许多安全性问题。例如,Drupal通过检查来保证,用户从下拉选择框中选择的值,确实是Drupal生成的选项中的一个。表单API使用了一系列的事件集,比如表单构建、验证、和执行。在验证阶段前面,你不能够使用用户输入,因为用户输入还没有被验证。例如,如果你使用的值来自$_POST,那么你就不能确保用户是否操作了该值。还有就是,使用#value元素在表单中传递信息,尽可能的使用它来代替隐藏域,因为恶意用户可以操作隐藏域,但是访问不了#value元素。

对于用于构建表单的用户提交的数据,也需要进行适当的安全清理,这和用户提交的其它数据一样,如下所示。
不安全:
 
$form['foo'] = array(
'#type' => 'textfield',
'#title' => $node->title, // XSS vulnerability!
'#description' => 'Teaser is: '. $node->teaser, // XSS vulnerability!
'#default_value' => check_plain($node->title), // Unnecessary.
);
 
安全:
 
$form['foo'] = array(
'#type' => 'textfield',
'#title' => check_plain($node->title),
'#description' => t('Teaser is: @teaser', array('@teaser' => $node->teaser)),
'#default_value' => $node->title,
};
 
对于默认值,没有必要使用check_plain(),这是因为表单元素类型的主题函数实现了这一点(在这里,为includes/form.inc中的theme_textfield()函数)。
 
警告 如果你使用自己的主题函数来覆写Drupal的默认主题函数,那么你需要检查一下,在默认的主题函数中是不是对一些用户输入作了安全处理,如果有的话,在你的代码里,也需要实现这一点。
 
更多关于表单API的信息参看第10章。
 老葛的Drupal培训班 Think in Drupal

Drupal版本: