Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 菲尼克斯无效CSRF_Elixir_Phoenix Framework - Fatal编程技术网

Elixir 菲尼克斯无效CSRF

Elixir 菲尼克斯无效CSRF,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在尝试进行本地文件上载,但当我进行POST请求时,我得到了无效的CSRF(跨站点请求伪造)令牌,请确保所有请求都包含有效的“\u CSRF\u token”参数或“x-CSRF-token”头错误 我已经尝试调用这个函数了 def csrf_token(conn) do Plug.Conn.get_session(conn, :csrf_token) end my.html.eex: <form action="/accounts/new/csv-validator" met

我正在尝试进行本地文件上载,但当我进行POST请求时,我得到了无效的CSRF(跨站点请求伪造)令牌,请确保所有请求都包含有效的“\u CSRF\u token”参数或“x-CSRF-token”头错误

我已经尝试调用这个函数了

def csrf_token(conn) do
    Plug.Conn.get_session(conn, :csrf_token)
end
my.html.eex:

<form action="/accounts/new/csv-validator" method="post" 
enctype="multipart/form-data">
    <input type="hidden" name="_csrf_token" value="<%= @get_csrf_token() %>">
    <input class="form-control input-bordered" id="user_photo" name="user[photo]" type="file">
</form>

预期结果:使用有效的csrf令牌成功完成POST


Phoenix版本:Phoenix中的v1.3.4

是一个宏,即它是一个宏函数的名称:

@实际上是一个将@key转换为Map.get(赋值,:key)的宏

()

事实上,我认为这句话有一个错误,应该是:

@实际上是一个宏,它将@key转换为关键字.get(赋值, :键)

分配
来自这里:

render(conn, template, assigns)

因此,如果像这样调用render:

render(conn, "page.html", message: "hello", answer: "yello")
                          |_______________________________|
                                        ^
                                        |
                                      assigns (a keyword list)
def your_action(conn, _params) do
  render(conn, "page.html", csrf: csrf_token(conn) )
end
然后,在
page.html
模板中,如果您编写
@message
,Phoenix将用
关键字.get(assigns,:message)
替换它,其计算结果为
“hello”

这应该证明在模板中编写
@get\u csrf\u token()
是胡说八道。相反,您需要做的是这样的事情:

render(conn, "page.html", message: "hello", answer: "yello")
                          |_______________________________|
                                        ^
                                        |
                                      assigns (a keyword list)
def your_action(conn, _params) do
  render(conn, "page.html", csrf: csrf_token(conn) )
end

然后,您可以在模板中编写
@csrf
来插入令牌。

我发现@7stud具有教育意义和帮助,但我没有留下明确的解决方案;所以我想试试看

使用Phoenix呈现EEx模板时,有很多选项。在这个问题上,@Leka似乎没有使用Phoenix.HTML,但我会将其与其他选项一起列出

没有Phoenix.HTML:

<form method="post" action"...">
  <input type="hidden" name="_csrf_token" value="<%= Plug.CSRFProtection.get_csrf_token() %>">
  ...
</form>

...
凤凰城的版本也做了同样的事情:

<form method="post" action"...">
  <input type="hidden" name="_csrf_token" value="<%= Phoenix.Controller.get_csrf_token() %>">
  ...
</form>

...
对于Phoenix.HTML,各种表单在发布时会自动执行此操作(这是默认操作):


...

我不能百分之百地回答这个问题,但看起来@Leka可能正在定义一个定制的CSRF函数。如果这样做,只要在相应的Phoenix视图文件中定义了该函数,就可以使用“@”宏从模板调用该函数


除非需要超出插件所提供范围的自定义代码,否则这种方法是不必要的。在render中使用assigns参数的@7stud方法也是如此。再一次,不要对@7stud的回答不尊重;这可能是对他们对@Leka试图做什么的解释的直接回应。

老实说,我认为这里没有足够的信息。我看到的唯一可疑之处是,您在第一个代码片段“csrf_token()”中有一个方法,然后在输入中有“@get_csrf_token()”。请尝试此
name=“csrf token”id=“csrf token”value=“”