феникс неверный CSRF - PullRequest
       17

феникс неверный CSRF

0 голосов
/ 29 декабря 2018

Я пытаюсь загрузить локальный файл, но когда я делаю POST-запрос, я получаю invalid CSRF (Cross Site Request Forgery) token, make sure all requests include a valid '_csrf_token' param or 'x-csrf-token' header error

Я уже пытаюсь вызвать эту функцию

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>

ожидаемый результат: успешное выполнение POST с действительным токеном csrf

Версия Phoenix: v1.3.4

1 Ответ

0 голосов
/ 01 января 2019

В Фениксе @ - это макрос, т.е. это имя функции макроса:

@ - это на самом деле макрос, который переводит @key в Map.get (назначает,: ключ).

(https://hexdocs.pm/phoenix/templates.html)

Я действительно считаю, что в этой цитате есть ошибка, и она должна выглядеть так:

@ - это на самом деле макрос, которыйпереводит @key в Keyword.get (назначает,: ключ).

И assigns происходит отсюда:

render(conn, template, assigns)

https://hexdocs.pm/phoenix/Phoenix.Controller.html#render/3

AsВ результате, если вы вызываете render следующим образом:

render(conn, "page.html", message: "hello", answer: "yello")
                          |_______________________________|
                                        ^
                                        |
                                      assigns (a keyword list)

, а затем в шаблоне page.html, если вы напишите @message, то Phoenix заменит это на Keyword.get(assigns, :message), что оценивается в "hello".

Это должно продемонстрировать, что написание @get_csrf_token() в вашем шаблоне - нонсенс. Вместо этого вам нужно сделать что-то вроде этого:

def your_action(conn, _params) do
  render(conn, "page.html", csrf: csrf_token(conn) )
end

Затем в своем шаблоне вы можете написать @csrf чтобы вставить токен.

...