У меня возникла следующая проблема с токенами XSRF.Настройка сеанса PHP на индексной странице для проверки XSRF
Клиент: AngularJS Сервер: PHP
Когда index.php хит, PHP генерирует XSRF маркер и сохраняет его в сессии. Файл cookie устанавливается с одинаковым значением.
AngularJS считывает файл cookie и сохраняет его.
При последующих POSTS токен XSRF отправляется как заголовок, и идея заключается в сравнении сохраненного токена сеанса с отправленным заголовком.
Все кажется прекрасным, никаких проблем.
НО: проблема в том, что PHP не может прочитать сеанс, зарегистрированный в index.php, потому что технически не было перезагрузок страниц! Если я удалю F5 и перезагрузим все, сеанс будет хорошо прочитан.
Как установить токен сеанса XSRF на index.php и получить его для последующих запросов ajax от клиента? Я вытягиваю волосы на этом ... ценю обратную связь.
UPDATE
После изменения имени идентификатора сеанса, все вдруг сработало!
В index.php:
// Create token and set session
session_start();
$token = hash('sha256', uniqid(mt_rand(), true));
$_SESSION['XSRF']=$token;
Позже, также в index.php:
/* Give token to Angular client */
<script>
angular.module("app").constant("CSRF_TOKEN", '<?=$_SESSION['XSRF'];?>');
</script>
Обратите внимание, что я не использую печенье, вместо этого я установить константу, которая затем сделал доступны для метода .run в угловом:
в Угловом:
angular.module('app').run(['CSRF_TOKEN','$http',function(CSRF_TOKEN,$http) {
$http.defaults.headers.common['CSRF_TOKEN'] = CSRF_TOKEN;
Все запросы на сервер направляются в один общий файл php. Проверяет файл, если заголовок установлен, и сравнивает два маркера:
// Only POST requests are checked (I don't use PUT/DELETE)
if($_SERVER['REQUEST_METHOD']=="POST"){
session_start();
$headerToken = $_SERVER['HTTP_CSRF_TOKEN'];
$sessionToken = $_SESSION['XSRF'];
if($headerToken!=$sessionToken){
header('HTTP/1.0 401 Unauthorized');
exit;
}
}
Вы отправляете на index.php в свои $ http-вызовы или на другую страницу php на своем сервере? Если я понимаю вашу проблему, это то, что php-файл получает пустой сеанс? –
Если я правильно понимаю ...Вы можете сгенерировать переменную токена XSRF с помощью PHP и поместить в JS-код, если хотите, чтобы он был доступен для аякс-запросов ... Возможно, какой-то пример вашего кода поможет? –
Нет причин для этого не работать. По первому запросу вы создаете сеанс и токен и возвращаете куки-файл сеанса с первым ответом. Сессия существует сейчас, все последующие запросы имеют активный сеанс. Нам понадобится дополнительная информация, чтобы помочь вам здесь. – deceze