2014-08-31 2 views
1

Когда я отключить защиту CSRF, то все мои запросы POST отправленных AngularJS принимаются, но когда она включена я получаю следующее сообщение об ошибке:Spring MVC в 4 AngularJS 1,3 HTTP POST имеет нулевой CSRF маркер или заголовок

ОШИБКА:

Статус HTTP 403 - Недействительный токен CSRF «null» был найден в параметре запроса «_csrf» или заголовке «X-CSRF-TOKEN».

Из того, что я понял, запрос не отправляет какой-либо контент в соответствие с токеном _csrf или заголовок не установлен.

У меня есть это в мой код заголовка HTML:

<head> 
    (...) 
    <meta name="_csrf" content="${_csrf.token}"/> 
    <meta name="_csrf_header" content="${_csrf.headerName}"/> 
    (...) 
</head> 

Я смотрел на вопросы, касающиеся CSRF и весной, которые были размещены здесь, но я, к сожалению, не удалось решить мою проблему, хотя я пытался использовать различные образцы кода, представленные как решения.

Я думаю, что я должен как-то отправить данные CRSF с моим POST-запросом, но я не знаю, как это сделать.

Я признателен за любую помощь :)

ответ

0

Вы видели документацию на angularJS $ HTTP и XSRF-маркер (то же самое):

https://docs.angularjs.org/api/ng/service/ $ HTTP прокрутите вниз до Cross Site Request Forgery (XSRF) Protection

You можно настроить AngularJs автоматически обрабатывать его:

The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, or the per-request config object. 
+0

Могу ли я попросить образцы кода, как это сделать? Мне трудно понять онлайн-документацию AngularJS. – Eslaron

0

Интересно, почему вы хотите использовать защиту CSRF в контроллере, который написан на передней панели javascript. Цель CSRF состоит в том, чтобы избежать того, что другой сайт отправит повторный запрос с нежелательными данными. Если вы используете AngularJs для получения защищенного csrf, любой злой сайт сможет отправить в браузер код javascript, чтобы сначала получить токен, а затем опубликовать нежелательные данные. IMHO, вы не должны полагаться на защиту CSRF при использовании Ajax.

+0

@eslaron Похоже, я должен был прочитать о той же политике происхождения сайта * перед публикацией. Если в браузере не возникнут серьезные проблемы, то описанная мной атака, как мы надеемся, запрещена. Удалит этот stupide post ... –

+0

Итак, было бы хорошо сделать работу CSRF между весной и angularjs, но после всего этого времени я все еще не могу заставить ее работать. – Eslaron

-1

Вы можете попытаться изменить name="_csrf" на номер name="csrf". Кажется, в Лиравеле недопустимы подчеркивания. Это так, если говорить о заголовках.

Например:

$token = Request::header('_csrf'); // Not working 

$token = Request::header('csrf'); // Working! 


Следует отметить, что вышесказанное относится к Laravel 4.2

0

Быстрое & загрязненного раствора:

JSP-страница

Р или простота, просто используя jQuery для доступа к токенам в метатегах и помещая их в переменные JavaScript (это может быть улучшено, просто не успели узнать, как читать значения метатега непосредственно из AngularJS).

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
<head> 
    <script src="<c:url value='/resources/js/jquery-2.1.4.min.js'/>" type="text/javascript"></script> 
    <script src="<c:url value='/resources/js/angular/angular.min.js'/>" type="text/javascript"></script> 
    <sec:csrfMetaTags /> 
    <c:if test="${!empty _csrf.token}"> 
     <script type="text/javascript"> 
      var csrfParameter = $("meta[name='_csrf_parameter']").attr("content"); 
      var csrfHeader = $("meta[name='_csrf_header']").attr("content"); 
      var csrfToken = $("meta[name='_csrf']").attr("content"); 
     </script> 
    </c:if> 
</head> 
  • убедитесь, что маркер CSRF действительно оказывается на странице (то есть, что эта страница защищена Spring CSRF фильтром), то есть что-то вроде содержится на странице, когда вы смотрите на источник следующее код (на самом деле мета-теги будут находиться в одной строке, он просто сделал дисплей правильно в StackOverflow просмотра при попытке использовать исходный HTML):
<meta name="_csrf_parameter" content="_csrf" /> 
<meta name="_csrf_header" content="X-CSRF-TOKEN" /> 
<meta name="_csrf" content="38452f36-d47b-4d49-b7ec-8b08cb8f9fa8" /> 
<script type="text/javascript"> 
    var csrfParameter = $("meta[name='_csrf_parameter']").attr("content"); 
    var csrfHeader = $("meta[name='_csrf_header']").attr("content"); 
    var csrfToken = $("meta[name='_csrf']").attr("content"); 
</script> 

конфигурации AngularJS

Добавьте в конфигурацию вашего приложения (или модуля) следующее. При этом переменные JavaScript, которые неявно помещенные в window.csrfToken и т.д. выше, доступны с помощью службы AngularJS $ окно для настройки службы $ HTTP:

app.run(['$http', '$window', '$document', function($http, $window) { 
    $http.defaults.headers.post[$window.csrfHeader] = $window.csrfToken; 
}]); 

Вы также можете добавить

$http.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; 

, как заголовок по умолчанию.

Смежные вопросы