Чтобы не допустить «злонамеренных» действий с некоторыми внутренними компонентами Ajax, я добавляю две переменные GET, одна - это дата (обычно в эпоху), затем я беру эту дату, добавляю соль и SHA1, а также публикую ее, если дата (при перефразировании) не соответствует хешу, тогда я отбрасываю запрос, в противном случае выполняю его.
Конечно, я выполняю шифрование перед отображением страницы и передаю хэш и дату JS. Иначе это было бы бессмысленно.
Проблема с использованием ограничений на основе IP / cookie заключается в том, что оба они могут быть обойдены.
Используя маркерный метод с хорошей, криптографически стойкой солью (скажем, что-то вроде «Совершенных паролей» Стива Гибсона https://www.grc.com/passwords.htm), потребуется ОГРОМНОЕ количество времени (в масштабе десятилетий), прежде чем метод сможет надежно предсказуемо и обеспечивает определенный уровень безопасности.