#php #ajax #laravel #laravel-5.3
#php #ajax #laravel #laravel-5.3
Вопрос:
У меня есть страница, которая после открытия отправляет серию сообщений ajax в конечную точку уведомления. Я хотел бы сохранить данные в сообщениях, используя гостевой сеанс. Входа нет, но контекстное управление независимо. Я использую cookies.
У меня возникают проблемы с восстановлением объектов из сеанса из-за этих запросов ajax (они приходят нулевыми), и я заметил, что при каждом сообщении в конечную точку уведомления я получаю другое значение для request()->session()->getId()
, что заставляет меня думать, что сеанс не передается должным образом, и именно поэтому я не вижу, чтобы объекты, которые я ожидал увидеть, сохранялись.
Мои URL-адреса используют промежуточное программное обеспечение «web».
Каждый раз, когда страница открывается, я делаю:
<script>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '<?php echo csrf_token(); ?>'
}
});
</script>
Чтобы гарантировать, что запросы ajax будут иметь токен CSRF в заголовке
Я также выполняю ‘request ()-> session ()-> regenerate();’каждый раз, когда открывается страница (не в уведомлениях), чтобы обеспечить новый сеанс.
Есть ли что-нибудь еще (возможно, переданные значения из файлов cookie), что я должен отправить в СООБЩЕНИИ, чтобы идентифицировать запрос как часть контекста?
Комментарии:
1. Пожалуйста, можете ли вы показать свой код для этого? т. Е. ваш метод контроллера и ваш ajax-запрос?
Ответ №1:
Вы должны сделать его без состояния.
- Отправьте запрос от клиента к серверу
- Сервер генерирует и возвращает «токен»
- Клиент получает токен и сохраняет его, например, в локальном хранилище
- Клиент отправляет с каждым запросом токен в качестве заголовка (или в качестве параметра в URL)
- (сервер проверяет токен из заголовка)
Преимуществом является ваша независимость от обработки сеанса.
Комментарии:
1. Я сделал это, используя отметку времени в миллисекундах в качестве токена, и решил свою проблему! Есть ли какой-либо «Laravel way» для генерации какого-либо более надежного токена? Или CSRF должен позаботиться о безопасности, и я могу придерживаться метки времени?
2. @PauloAmaral Я предпочитаю хэширование с помощью ключа. Смотрите php.net/manual/en/function.hash-hmac.php
Ответ №2:
var _id = 1011;
var url = "/test";
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
beforeSend: function(){
},
url: url,
data: {id: _id},
type: 'POST',
dataType: 'json',
success: function(result){
}
});
Комментарии:
1. Это была одна из моих первых попыток, неудачная, кстати. Согласно моим исследованиям, токен CSRF больше связан с обеспечением надежности клиентских запросов, а не с уникальностью сеанса, верно?
2. токен csrf предотвращает атаки csrf
3. скопируйте этот код => <meta name=»csrf-token» content=»{{ csrf_token() }}»>