Drupal在呈现表单时将form_token作为隐藏字段插入.然后在表单提交上检查form_token以防止跨站点请求伪造攻击.提交的表单数据保证来自Drupal呈现的原始表单.
但是,使用"GET"方法的表单不需要此标记.它所做的只是延长和uglify生成的URL.
有什么方法可以抑制它吗?
Hen*_*pel 13
是的,有办法,但要有意识地使用它(见下面的警告):
如果您自己创建表单,请添加
$form['#token'] = FALSE;
Run Code Online (Sandbox Code Playgroud)
到表单定义数组应该防止首先生成令牌.
如果您正在处理现有表单,则可以通过取消设置'#token'元素来绕过令牌验证过程hook_form_alter:
// Example for removal of token validation from login (NOTE: BAD IDEA!)
function yourmodule_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'user_login_block') {
unset($form['#token']);
}
}
Run Code Online (Sandbox Code Playgroud)
警告:鉴于您的问题,我认为对GET和POST请求之间的差异(更好,缺乏差异)存在轻微的误解.
...使用"GET"方法的表单上不应该需要此令牌.它所做的只是延长和uglify生成的URL.
这是错的!GET和POST只是两种不同的,但大多数是从客户端向服务器传输数据的等效方法.由于POST更适合传输大量数据(或难以格式化的数据),因此它是提交表单的既定标准,但它绝不比GET请求更安全/更不安全或更安全.恶意用户可以以相同的方式篡改这两种类型的请求,因此两种类型都应使用相同的保护机制.
使用GET请求时,令牌与POST请求完全相同 - 它向服务器证明提交的数据来自与构建表单的请求相同的计算机上的相同浏览器!因此,如果您确定不能通过XSRF滥用请求,则只应将其删除.
小智 9
这对我有用.我不得不取消设置所有形式的api元素并将#token属性设置为false.注意after_build函数用于取消设置其他属性.
function mymodule_form(&$form_state){
$form['name'] = array(
'#type' => 'textfield',
'#title' => 'name',
'#value' => 'name',
);
$form['#method'] = 'get';
$form['#action'] = url('someurl');
$form['submit'] = array('#type' => 'submit', '#value' => 'go');
$form['#token'] = false;
$form['#after_build'] = array('mymodule_unset_default_form_elements');
return $form;
}
function mymodule_unset_default_form_elements($form){
unset($form['#build_id'], $form['form_build_id'], $form['form_id']);
return $form;
}
Run Code Online (Sandbox Code Playgroud)