gpt4 book ai didi

javascript - 这会导致 Rails 检测到 CSRF 吗?

转载 作者:行者123 更新时间:2023-11-28 02:38:44 25 4
gpt4 key购买 nike

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

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

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

那么我正在做的事情是否会导致rails检测到CSRF并从而清除我的 session ?还有其他人知道的 session 可能被清除的原因吗?另外,如果没有ajax(因为我不想搞砸它,它就不能很好地发挥作用。)是否有另一种好方法我缺少传递javascript变量(它必须是javascript,我正在使用javascript函数来获取用户当前位置)以便它可用于 rails ? (我在想,而不是用 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();
}

最佳答案

任何形式的请求,和ajax都必须传递CSRF token。您需要在表单中创建一个名为 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;
}
}

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

关于javascript - 这会导致 Rails 检测到 CSRF 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com