Использование случайно сгенерированного токена для защиты от наводнений
Базовая настройка моего сайта: пользователь вводит сообщение на главной странице, нажимает клавишу ВВОД, и сообщение отправляется через AJAX-запрос в файл с именем like.php
где эхо - это ссылка, которая отправляется обратно пользователю.
Я сделал отключение ввода, когда пользователь нажимает ввод, но ничто не мешает пользователю просто постоянно флудить like.php
с запросом POST и заполнением моей базы данных.
Кто-то здесь на SO сказал мне использовать систему токенов, но не упомянул как. Я видел, как это делалось раньше и насколько я знаю, это эффективно.
Единственная проблема у меня есть, как будет like.php
знаете, это действительный токен? Мой код это на данный момент:
$token = md5(rand(0, 9999) * 1000000);
и разметка:
<input type="hidden" name="token" value="<?php echo $token ?>" />
Который отправит токен like.php
через ПОСТ. Но как будет like.php
знаете, что это действительный токен? Должен ли я вместо токена что-то, что связано с пользователем? Понравился их IP-адрес? Или, возможно, отметьте текущую минуту и проверьте, что это та же самая минута в like.php
...
Любая помощь по этому поводу будет принята с благодарностью, спасибо.:)
3 ответа
Лучший способ - использовать переменные сеанса, потому что пользователи не могут их удалить или изменить так же легко, как элемент формы. Или, что еще лучше, сохраните IP-адрес и время в базе данных и найдите его, чтобы узнать, сможет ли пользователь снова публиковать сообщения.
Не изобретайте колесо - просто посмотрите время последнего комментария от этого пользователя, определяемое user_id, user_ip, что бы у вас ни было - и решите, разрешено ли ему публиковать сообщения или нет.
Одна минута кажется слишком долгой для большинства пользователей. Просмотр с помощью вкладок, широкополосный интернет-сервис и склонность пользователей не читать каждый фрагмент текста, который они представляют, способствуют появлению массы пользователей, которым, скорее всего, надоест менее чем через минуту, когда они ничего не делают.
Я бы определенно предложил хранить IP-адреса пользователей.