2012-02-07 3 views
1

У меня крошечный сервис url, отправка данных на сервер работает просто с помощью функции ajax, которая отправляет данные на определенную страницу и вставляет данные в базу данных.PHP: предотвратить переполнение базы данных

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

сессия и печенье может не работает здесь по очевидной причине.

how can i prevent this? 
+1

Может быть дубликат http://stackoverflow.com/questions/1375501/how-do-i-throttle-my-sites- api-users – iblue

+0

Вы ищете гарантию от случайного злоупотребления, «позвольте мне попробовать это» - нападения или злонамеренные «детишки сценариев»? – VolkerK

ответ

0

Что я думаю, вы хотите предотвратить, это атака DOS (отказ в обслуживании). В Интернете много информации о том, как предотвратить это. Для очень простого сервисного решения вы можете ограничить взаимодействие с вашей базой данных, чтобы потребовать паузу между запросами.

Вы можете использовать сеансы, чтобы предотвратить это.

Flow: просмотров страницы

  1. пользователя - создать сеанс
  2. Пользователь использует сервис на основе с помощью AJAX
  3. На АЯКС запросу - проверить, если сессия содержит "last_run" метку времени.
  4. Если этого не существует, разрешите запрос, добавьте «last_run»
  5. Если он существует и отметка времени старше вашего тайм-аута (скажем, 1 секунда), разрешите запрос, обновите «last_run».
  6. Если он существует и отметка времени не старше вашего тайм-аута, не разрешайте запрос.
+0

Это может быть защита от случайного злоупотребления и обновления «обновления» обновления.Это не мешает кому-либо выбросить файл cookie сессии и сделать новый запрос. – VolkerK

+0

Правильно, это простое решение. Если потребуется больше, нам потребуется гораздо больше информации о конкретной установке, о том, что он на самом деле пытается предотвратить, количестве транзакций, если аппаратные решения возможны и т. Д. – evan

1

Очень простой способ исправить эту проблему, которая работает очень хорошо и предотвращает атаки DDOS, чтобы использовать объемные вставки для функции пост-обработки. Для вашего tinyurl есть вызов, который позволяет сохранить все данные, которые вводятся как конкатенированный файл в файловой системе в плоском текстовом файле (CSV).

Затем запустите задание cron каждые 1 ~ 5 минут, которое читает текстовый файл и делает массовым вставить в mysql. Ключевым моментом здесь является массовые вставки. Гораздо эффективнее делать 1 объемную вставку, чем 100 000 000 одиночных запросов.

Чтобы дать вам представление, я ежедневно обрабатываю массивные вставки данных, где мы получаем примерно 1 миллион запросов на вставку в минуту. Выполнение 1-миллиметровых вставок в виде отдельных запросов приведет к нашему огромному серверу около 15 минут. Выполнение их в виде объемной вставки занимает около 18 секунд. Это ошеломляет, насколько быстрее загружаются массовые вставки, и вы также потребляете только 1 соединение в своем ящике mysql.

Массовые вставки очень похожи на обычную вставку, единственная разница в запросе находится в части VALUES. Если у вас обычно есть VALUES = ('abc', '123', 'abc'), например, у вас теперь будет ... VALUES = (('abc', '123', 'abcd'), ('cde' , '456', 'Д');

Надеется, что это помогает :)

Смежные вопросы