Это вопрос о создании токенов CSRF.
Обычно я хотел бы создать токен, основанный на уникальной части данных, связанной с сеансом пользователя, и хешировать и солить секретным ключом.
Мой вопрос заключается в том, чтобы генерировать токены, когда нет уникальных пользовательских данных для использования. Нет сеансов, файлы cookie не являются опцией, IP-адрес и такие вещи ненадежны.
Есть ли причина, по которой я не могу включить строку в хэш как часть запроса? Пример псевдокода для создания маркера и его вставки:
var $stringToHash = random()
var $csrfToken = hash($stringToHash + $mySecretKey)
<a href="#" onclick="location.href='http://foo.com?csrfToken={$csrfToken}&key={$stringToHash}'; return false;">click me</a>
Пример проверки на стороне сервера токена CSRF
var $stringToHash = request.get('key')
var $isValidToken = hash($stringToHash + $mySecrtKey) == request.get('csrfToken')
Строка, используемая в хэше, будет отличаться для каждого запроса. До тех пор, пока он будет включен в каждый запрос, проверка маркера CSRF может продолжаться. Поскольку он является новым для каждого запроса и только встроен в страницу, внешний доступ к токену будет недоступен. Безопасность токена тогда падает до $mySecretKey, который известен только мне.
Это наивный подход? У меня отсутствует какая-то причина, почему это не может работать?
Спасибо