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