2013-06-25 4 views
1

Любой может использовать простой цикл для чата ajax, а чат посылает 1000 сообщений в разы. В моем чате ajax каждое сообщение сохраняется с датой, временем (временными метками).AJAX chat - Предотвратить спам-сервер?

мне нужно найти способ, чтобы предотвратить эту проблему, я думал, что на один, но я не знаю, как бы я это сделать:

Предотвращение спама на послеоперационное время

В основном выбор 5 сообщений о том, что их дата, время, показывающее менее 10 секунд (вместе). Если эти сообщения были отправлены менее чем за 10 секунд, заблокируйте пользователя из чата в течение нескольких секунд.

Но я действительно не думаю, что это может работать, и не знаю, как это сделать.

Есть ли схожие или лучшие решения или советы о том, как это сделать?

+0

Почему не будет работать? Подсчет последних X-сообщений за определенный промежуток времени кажется мне совершенно разумным решением. – jeroen

+0

Может быть, но как вы выбираете элементы за определенное время? –

+0

Вы сказали, что сохранили временные метки с каждым сообщением, поэтому просто используйте запрос, чтобы вытащить количество сообщений за последние X секунд. – Pitchinnate

ответ

3

В части ваших сценариев, где сервер собирается сохранить сообщение чата, вы подключить запрос к базе данных, как

SELECT COUNT(*) 
FROM chat_messages 
WHERE uid='1234' AND timestamp > DATE_SUB(NOW(), INTERVAL 10 SECOND) 
LIMIT 10 

затем проверить, если результат больше, чем ваш предел и возвращает ложь, или сообщение «слишком много сообщений, отправленных в слишком короткое время»

другой, может быть, лучше было бы определить не только пользователь/сессии, но и сохранить IP и лимит сообщений на IP. Многие современные боты могут легко обойти сеансы или переключиться на IP очень быстро, поэтому вы должны пойти на комбинацию более чем одной техники.

Также обратите внимание на предотвращение на стороне клиента, например, хеширование сообщения или добавление контрольной суммы к сообщениям. Многие боты не слишком хорошо говорят о JavaScript.

+0

uid = имя пользователя/имя, правильно? –

+0

есть. у вас есть столбец для идентификации пользователя/сессии, не так ли? – DanFromGermany

+0

«Многие боты не слишком хорошо говорят на JavaScript.«Я всегда полагаю, что, если кто-то возится со сценариями AJAX, они уже достигли уровня манипуляции javascript. Лучше сохранить, чем извините – Martijn

4

EDIT: решение, отправленное DanFromGermany, является хорошим методом, если у вас есть ресурс базы данных. Если БД является узким местом, вы можете перейти к следующему методу:

У вас есть вызов AJAX в phpfile, скажем, process.php. В process.php вы начинаете сеанс и начинаете значение $ _SESSION ['lastChatMessage'] = 0;

Тогда вы делаете, если/еще Arround фактический код:

// time based check: 
if($_SESSION['lastChatMessage'] > time()-1){ echo "Only one post per second";} 
else{ 
    // some code you use now 
    $_SESSION['lastChatMessage'] = time();// save time of posting 
} 

Вы можете также сделать массив $ lastChatMessage и помнить каждый раз, когда в нем. Затем создайте функцию, которая удаляет все значения, меньшие, чем time() - $ diffYouWant. ряд должностей будет оставаться, это до вас, как большой Вы хотите, чтобы число было :)

if(count($_SESSION['lastChatMessage']) > $maxPostsAllowed){ echo 'No flooding please';} 
else{ 
    // your code 
} 
+0

Я согласен с этим. Запрос db для предотвращения спама - очень плохое решение. – Sharky