首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >菲尼克斯-阿贾克斯岗位上的CSRF

菲尼克斯-阿贾克斯岗位上的CSRF
EN

Stack Overflow用户
提问于 2016-11-14 20:28:36
回答 3查看 3.6K关注 0票数 7

我正在学习如何使用菲尼克斯框架,我正在尝试对控制器操作执行AJAX发布--但是,我遇到了CSRF保护方面的问题。

首先,我不使用表单-只想将文本从输入传递到控制器:

代码语言:javascript
复制
<input type="text" id="raw-input" />
<button id="send-button">Send it!</button>

<script>
$("#send-button").click(function(){
    var input = $("#raw-input").val();

    $.ajax({
        url: "/test/process",
        type: "POST",
        dataType: "json",
        beforeSend: function(xhr) {xhr.setRequestHeader("X-CSRF-Token", $("meta[name='csrf-token']").attr("content"))},
        data: {"input" : input},
        success: function(response){
            console.log(response);
        }
    });
});
</script>

控制器(不担心做任何事input ).只想验证一个成功的帖子!):

代码语言:javascript
复制
def process(conn, %{"input" => input}) do
    IO.puts "got it!"
end

路由器:

代码语言:javascript
复制
post "/test/process", TestController, :process

我几乎取消了Rails应用程序中的$.ajax调用,因为它运行得很好,但这里并没有做到这一点--运行它会返回一个403个错误并记录(Plug.CSRFProtection.InvalidCSRFTokenError) invalid CSRF (Cross Site Request Forgery) token, make sure all requests include a valid '_csrf_token' param or 'x-csrf-token' header

有人能提供任何指导吗?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-15 08:42:18

这是因为在默认情况下,菲尼克斯不使用CSRF令牌创建元标记。它们只包含在由菲尼克斯的助手函数生成的表单中,并且在隐藏的输入中。

要在菲尼克斯以编程方式获得CSRF令牌,您可以调用Plug.CSRFProtection.get_csrf_token/0。有许多方法可以将此传递给您的JS。您可以在布局中添加一个元标记,以便将其包含到每个页面中,但这可能不是很有效,因为它将为所有页面生成。您还可以将它存储在您需要它们的视图中的JS变量中:

代码语言:javascript
复制
<input type="text" id="raw-input" />
<button id="send-button">Send it!</button>

<script>
$("#send-button").click(function(){
    var CSRF_TOKEN = <%= raw Poison.encode!(Plug.CSRFProtection.get_csrf_token()) %>;
    var input = $("#raw-input").val();

    $.ajax({
        url: "/test/process",
        type: "POST",
        dataType: "json",
        beforeSend: function(xhr) {
            xhr.setRequestHeader("X-CSRF-Token", CSRF_TOKEN);
        },
        data: {"input" : input},
        success: function(response){
            console.log(response);
        }
    });
});
</script>
票数 14
EN

Stack Overflow用户

发布于 2018-06-30 16:15:25

凤凰城已经有了助手标签。将其包括在布局中如下:

代码语言:javascript
复制
<html lang="en">
  <head>
     <%= csrf_meta_tag %>
     ...

然后在js中使用它,如:$("meta[name='csrf-token']").attr("content")

票数 12
EN

Stack Overflow用户

发布于 2019-02-12 14:01:22

如果您想跳过CSRF令牌检查(如果您只是在开发API),那么您可以在下面的行中进行注释-

插头:protect_from_forgery

在您各自的web/router.ex内部

票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40597248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档