Elixir 菲尼克斯无效CSRF
我正在尝试进行本地文件上载,但当我进行POST请求时,我得到了无效的CSRF(跨站点请求伪造)令牌,请确保所有请求都包含有效的“\u CSRF\u token”参数或“x-CSRF-token”头错误 我已经尝试调用这个函数了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
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=“”