Предотвратить AJAX-флуд в Javascript - PullRequest
3 голосов
/ 21 сентября 2011

У моего сайта есть метод Javascript, который отправляет AJAX-запрос на добавление товара в корзину без перезагрузки страницы и простого уведомления.

 AddToCart()

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

while (true) {AddToCart()}

И в конечном итоге заблокировать сервер, пока браузер не выйдет из строя. Более стабильная среда просмотра может даже блокировать сервер на неопределенный срок. Итак, как лучше всего защититься от такой попытки?

Ответы [ 6 ]

6 голосов
/ 21 сентября 2011

Возможно, вам следует просто определить функцию в закрытом пространстве имен?

(function() {
   function AddtoCart(){};
})();

Таким образом, вы не можете ссылаться на него через консоль.

Это, конечно, не пуленепробиваемый , поскольку любой может просто скопировать код или сделать HTTP-запросы к URI.

Вы не можете остановить HTTP-запросы, но вы можете остановить обработку страниц, возможно, внедрив токены CSRF, чтобы не выполнять тяжелую обработку, если не совпадает токен CSRF, генерируемый вашей страницей, которая создает CSRF основанный на переменных, таких как отметка времени и тому подобное, поэтому его нельзя (легко?) воспроизвести.

4 голосов
/ 21 сентября 2011

Они могут нанести гораздо больший урон, используя ab (тест Apache) с высоким значением параллелизма, или они могут просто сидеть там, нажимая F5.Вам нужно решение более низкого уровня - ограничение скорости, возможно, по IP, или одноразовый хэш, или любое количество других решений.

4 голосов
/ 21 сентября 2011

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

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

На клиенте вы можете защитить себя от мошеннического javascript, который вводится несколькими способами. Ниже в вашем коде вы также можете установить ограничение скорости (например, непосредственно перед тем, как совершить реальный вызов ajax) и отказаться от выполнения более чем X вызовов ajax в минуту. Это не полностью защищает ваш сервер, но защищает вас от использования вашей собственной функции AddToCart ().

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

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

2 голосов
/ 21 сентября 2011

Запрос - это запрос, AJAX или нет. Те же правила применяются для обычной атаки DOS. Ничто не мешает людям звонить по вашему URL напрямую, даже без AJAX.

1 голос
/ 21 сентября 2011

Кто-то достаточно умен, чтобы выяснить ваш код, открыть консоль своего браузера и ввести while (true) {AddToCart()}, даже не нужен браузер (или ваш код) - он может просто выполнить wget в бесконечном цикле, или еслицель - это действительно DoS, для этой цели используйте script .

На стороне сервера вы решаете, как уменьшить атаку типа «отказ в обслуживании».Есть много стратегий ;использование Nginx обратного прокси-сервера - первое, что пришло мне в голову.

0 голосов
/ 21 сентября 2011

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

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

Эти два метода помогут, но не решат проблему полностью.Серверу действительно необходимо определить, поступает ли на него спам с помощью запросов от одного клиента, и ограничить их с помощью ограничителя скорости.

...