使用skip_before_filter逃避真实性令牌是否安全?

时间:2017-09-25 10:03:45

标签: javascript ruby-on-rails ruby

<!-- view filw --> <%= button_to "Delete all", "", :method => :delete, :id => "delete_confirmation_button",:onclick => "return confirm('Are you sure you want to delete items?')", :params => {"#{object.class.name.downcase}_id" => object.id }, :form => {:id => "tool_bar_delete_form"} %> 以其形式生成真实性令牌。但是,引发了无效的真实性令牌错误,因此许多线程建议将回调添加到目标控制器中的特定操作,如下所示:

 function detect_selected_items(object_name){

  /*  some code */

  var items_ids_string = "" ;
  switch (object_name )
  {
    case "Questionnaire":
      items_ids_string = "/questionnaire_items/" ;
      break;
    case "Lesson":
      items_ids_string = "/lesson_items/" ;
      break;
    case "Exam":
      items_ids_string = "/answers/" ;
      break;
   };

  items_ids_string += "delete_all/"
  items_ids_string += items_ids.join(",")
  document.getElementById("tool_bar_delete_form").action = items_ids_string  ;
}

由于表单路径是根据所选项目决定的,因此我使用以下函数稍后添加表单操作

<!-- controller file -->

skip_before_filter :verify_authenticity_token, :only => :delete_all
{{1}}

因为回调工作得很好。我的问题:

将这样的回调函数添加到控制器是否安全?如果没有?在这种情况下如何防止CSRF?

通过脚本添加表单操作会导致此类错误吗?

1 个答案:

答案 0 :(得分:0)

不,在这种情况下,您不应该跳过CSRF保护。您是否有javascript截取delete_confirmation_button上的点击?我几乎可以肯定你这样做了,一个未被拦截的button_to就不会有这个问题了。

如果您使用JS拦截点击并使用JS提交表单,则应更新脚本以包含页面上显示的CSRF meta标记的内容。 CSRF元标记如下所示:

<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="include-this-in-your-request" />

为名为&#34; authenticity_token&#34;的请求添加一个参数。使用csrf-token对您的javascript请求的值。