Play Framework CSRF error " [CSRF] проверка не удалась, так как в заголовках не найден токен"
Я новичок в игровом фреймворке и пытаюсь представить форму, но
получаем такую ошибку: "P.filters.CSRF - [CSRF] проверка не удалась, так как в заголовках не найден токен" . Я использую Play 2.6, вот мой код контроллера:
package controllers;
import play.libs.Json;
import play.mvc.*;
import views.html.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class HomeController extends Controller {
public Result index() {
return ok(index.render("Your new application is ready."));
}
public Result test() {
List<String> list = new ArrayList<>();
list.add("Jobs");
list.add("Work");
list.add("Say");
list.add("Stop");
return ok(test.render("test", list));
}
public Result testPost() {
Map<String,String[]> form = request().body().asFormUrlEncoded();
return ok(Json.toJson(form)).as("application/json");
}
}
Шаблон:
@(title: String, list: List[String])
@import helper._
<!DOCTYPE html>
<html lang="en">
<head>
<title>@title</title>
</head>
<body>
<form action="/test" method="post">
<textarea name="raw_text">
</textarea>
@CSRF.formField
<input type="submit" value="Submit" />
</form>
</body>
</html>
Что я делаю не так?
1 ответ:
Я не смог найти ничего неправильного в вашем коде, поэтому создал идентичный игровой проект локально. При отправке формы я не попал в этот вопрос. Это базовый проект, созданный с помощью:
sbt new playframework/play-java-seed.g8Размещение "Testing testing" в качестве содержимого textArea возвращает следующий Json (как показано браузером):
raw_text 0 " Testing testing" csrfToken 0 "8fdc72b2d628e4fc0d8f6359f2ea247cc0f22e5c-1499016237415-3c043ab2a02c18020df21a1f"Единственное, что я взял из своих собственных проектов, - это модифицированный класс фильтров, который выглядит следующим образом:
import play.mvc.EssentialFilter; import play.filters.cors.CORSFilter; import play.http.HttpFilters; import play.filters.csrf.CSRFFilter; import play.filters.headers.SecurityHeadersFilter; import java.util.List; import javax.inject.Inject; import javax.inject.Named; import java.util.Arrays; public class Filters implements HttpFilters { @Inject CSRFFilter csrfFilter; @Inject CORSFilter corsFilter; @Inject SecurityHeadersFilter secHeaders; @Override public List<EssentialFilter> getFilters() { return Arrays.<EssentialFilter>asList(new EssentialFilter[] { corsFilter.asJava(),secHeaders.asJava(), csrfFilter.asJava()}); } }Также мои маршруты следующие в conf / маршруты:
# Map static resources from the /public folder to the /assets URL path GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) GET / controllers.HomeController.test() POST /test controllers.HomeController.testPost()Удаление @CSRF.formField вызвало CSRF атак несанкционированного как раз для вас.
Если у вас есть какие-либо очевидные различия с вашей установкой, я был бы рад копнуть дальше, но это, кажется, не является прямой проблемой с вашим кодом.
Comments