【问题标题】:Could this cause a rails to detect a CSRF?这会导致导轨检测到 CSRF 吗?
【发布时间】:2012-10-12 10:31:59
【问题描述】:

好的,所以在其中一个页面上的 Rails 应用程序中,我需要传递一个 Javascript 变量,以便它可用于 rails。现在一个运行服务器端,一个运行客户端,所以我知道这非常困难。我查看了互联网并找到了一个解决方案,该解决方案涉及在我的外部 javascript 页面中包含的函数中动态创建表单。

基本上,使用document.createElement 语句创建了一个带有隐藏字段的表单,隐藏字段被赋予了我想要传递给rails 的值,然后调用form.submit() 以便提交表单。该表格被赋予了一种发布方法,并被赋予了一条路径。因此,当提交它时,页面重定向到另一个页面,其中隐藏字段现在位于 params 哈希中,并且可以通过带有 params[:param] 的 rails 访问。

这在一段时间内效果很好,直到我们开始使用会话来跟踪登录用户。单击要使用该动态表单重定向的按钮后,会话将被清除。我在网上发现的关于会话被清除的唯一情况是,当 rails 检测到 CSRF 时,它会清除会话。

那么我正在做的事情会导致 Rails 检测到 CSRF 从而清除我的会话吗?还有其他任何人都知道的会议可能被清除的原因吗?另外,如果没有 ajax(因为我只是不擅长搞砸,它不能很好地发挥作用。)我是否缺少传递 javascript 变量的另一种好方法(它必须是 javascript,我正在使用 javascript 函数来获取用户当前位置)以便它可用于轨道? (我在想而不是对表单进行 javascript 处理,我可能只是在我的页面上制作一个隐藏的表单,尽管这有点不那么优雅,因为任何查看源代码的人都可以看到它并想知道为什么它在那里并搞砸了)

如果有人感兴趣,下面是我的动态表单函数的代码。

function post_to_url(path, params, method) {
method = method || "post"; // Set method to post by default, if not specified.


var form = document.createElement("form");  
form.setAttribute("method", method);
form.setAttribute("action", path);     //page to go redirect to when form submitted


var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");

//after form is submitted params is available by params[:location]
hiddenField.setAttribute("name", 'location');     
hiddenField.setAttribute("value", params )

form.appendChild(hiddenField);



document.body.appendChild(form);



form.submit();
}

【问题讨论】:

    标签: javascript ruby-on-rails csrf dynamicform


    【解决方案1】:

    任何形式的请求,和ajax都必须通过CSRF令牌。您需要在表单中创建一个名为authenticity_token 的隐藏字段。然后你需要从元标记中获取值:

    <meta content="some_token_value" name="csrf-token" />
    

    像这样:

    var token = "";
    var tags = document.getElementsByTagName("meta");
    for(var i = 0; i < tags.length; i++) { 
      if(tags[i].name == "csrf-param") { 
        token = tags[i].content;
      }
    }
    

    然后只需将其放入隐藏标记的值中,就像您为位置值所做的那样。

    【讨论】:

    • 谢谢您,先生。你是一个绅士和一个学者。你修好了!!!!!!!!!!!!!我们已经为此苦苦挣扎了 2 天,而且它成功了!!!! :DDDD
    • 是的,这是几个月前我用 ajax 弄的,所以不客气 :)
    【解决方案2】:

    您可以在 javascript 文件中添加 erb 行:

    var csrf_token = '<%= form_authenticity_token %>';
    

    然后在您的请求中,在 post-data 中添加 'authenticity_token' : csrf_token

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2016-05-01
      • 2010-11-16
      • 1970-01-01
      相关资源
      最近更新 更多