2014-11-28 10 views
-2

Я следую этой статье http://blog.neoxia.com/laravel4-and-angularjs/, чтобы настроить и фильтровать токен CSRF. Я могу заставить его работать на локальном сервере, но после того, как я развернул его в прямом эфире и протестировал его, я продолжаю получать «код статуса 418». Есть идеи?Фильтр CSRF token для защиты от CSRF

Ниже мой код:

Route.php:

// Route to filter CSRF 
Route::filter('serviceCSRF',function(){ 
if (Session::token() != Request::header('csrf_token')) { 
    return Response::json([ 
     'message' => 'Security token doesn\'t match, possible CSRF attack.' 
    ], 418); 
} 
}); 

// Route for authentication 
Route::group(['prefix' => 'api/auth', 'after' => 'allowOrigin'], function() { 

Route::get('check', [ 
    'as'=>'check_auth_path', 
    'uses'=>'[email protected]' 
]); 

Route::post('login', [ 
    'as'=>'login_path', 
    'uses'=>'[email protected]' 
]); 

Route::get('sentryLogout', [ 
    'as'=>'logout_path', 
    'uses'=>'[email protected]' 
]); 
}); 

Controller Session:

class SessionsController extends \BaseController { 

public function __construct() { 
    $this->beforeFilter('serviceCSRF'); 
} 
... 

app.js:

var xhReq = new XMLHttpRequest(); 
xhReq.open("GET", "//" + window.location.hostname + "/api/csrf", false); 
xhReq.send(null); 

app.constant("CSRF_TOKEN", xhReq.responseText); 

app.run(function ($window, $couchPotato, $rootScope, $state, $stateParams, $http, CSRF_TOKEN) { 
    app.lazy = $couchPotato; 
    $rootScope.$state = $state; 
    $rootScope.$stateParams = $stateParams; 
    // editableOptions.theme = 'bs3'; 

    $http.defaults.headers.common['csrf_token'] = CSRF_TOKEN; 

    // watch for location path change 
    $rootScope.$on("$locationChangeStart",function() { 

    .... 
+0

ERM ребят, почему все вниз голосов? – Theren

+0

Код состояния - шутка april-fools ... – RichardBernards

+0

Я знаю это. Вопрос в том, почему он работает на местном, но не на производстве? – Theren

ответ

0

решаемая. Причина в том, что Request :: header(); не удалось интерпретировать параметр с помощью подчеркивания (csrf_token). Поэтому после того, как я перешел на

$http.defaults.headers.common['csrfToken'] = CSRF_TOKEN; 

и он работает!

Благодаря rvs1977 из (https://github.com/laravel/framework/issues/1655#issuecomment-20595277)

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