阻止form_token在Drupal"GET"表单中呈现

ctf*_*ord 8 drupal drupal-6

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滥用请求,则只应将其删除.

  • GET和POST之间的主要区别在于根据HTTP规范,GET应该是"安全的".这意味着XSRF攻击不是一个问题 - 欺骗用户的浏览器发出GET请求不应该导致服务器上的任何状态更改.这就是为什么我认为form_token是多余的. (3认同)
  • 这是正确的 - 在理论上:)这里的重要词语是"应该是"和"不应该".区别只是一个建议/最佳实践,但没有什么能阻止你或其他开发人员使用GET请求"不安全"的东西而且它经常出于方便而完成,因为一个简单的链接比一个表单实现更快,更轻量级.但是可以肯定的是,如果你知道你的GET所做的是无害的,那么删除令牌 - 我只想延伸GET不是"天生"安全的点,并且删除令牌处理应该是一个有意识的决定而不是自动发生. (2认同)

小智 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)

  • 谢谢你,对我很好.如果要删除提交附带的op =,只需将`'#tributes'=> array('name'=>'')`添加到提交数组中. (3认同)