2013-05-17 3 views
3

Мне было интересно, можно ли реализовать какую-то грубую защиту от вторжения JavaScript. Мой код получает события от сервера через AJAX, но иногда эти события могут быть довольно частыми (они не управляются мной).Защита от нежелательной почты от JavaScript?

Я попытался придумать способ борьбы с этим, и я написал небольшой скрипт: http://jsfiddle.net/Ry5k9/

var puts = {}; 

function receiverFunction(id, text) { 
     if (!puts[id]) { 
      puts = {}; 
      puts[id] = {}; 
     } 

     puts[id].start = puts[id].start || new Date(); 
     var count = puts[id].count = puts[id].count + 1 || 0; 
     var time = (new Date() - puts[id].start) * 0.001; 

     $("text").set("text", (count/time.toFixed()).toString() + " lines/second"); 

     doSomethingWithTextIfNotSpam(text); 
    } 
}; 

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

До сих пор я думаю, что все более 3 или 2,5 строк в секунду кажется спамом, но по прошествии времени вперед (потому что начальная отметка была установлена ​​... ну ... в начале), преступник мог просто простоять на некоторое время, а затем начните наводнение, фактически никогда не проезжая 1 линию в минуту.

Кроме того, я хотел бы добавить, что я использую библиотеки Mootools и Lo-Dash (возможно, они предоставляют интересные методы), но было бы предпочтительнее, если это можно сделать с использованием встроенного JS.

Любое понимание очень ценится!

+0

Вполне вероятно, что если кто-то Spams на сайте они не используют браузер для этого (т.е. они полностью обходят JavaScript). И в любом случае, если кто-то копирует текст в поле ввода, ваш метод либо ломается, либо думает, что он пытается затопить сайт. – JJJ

+0

@ Juhana: Но я получаю события с сервера (которые я не могу контролировать). – VariousThings

+1

Тогда я действительно не понимаю, что вы пытаетесь сделать, извините. Если события происходят с сервера, что такое событие keydown, которое пытается захватить? – JJJ

ответ

1

Я много дней размышлял над эффективными мерами, чтобы запретить наводнение, пока я не встретил решение, реализованное где-то в другом месте.

Во-первых, нам нужны три вещи, штраф и оценка переменных, и момент времени, когда последнее действие произошло:

var score = 0; 
var penalty = 200; // Penalty can be fine-tuned. 
var lastact = new Date(); 

Далее мы уменьшаем счет на расстояние между предыдущим сообщением и тока во времени.

/* The smaller the distance, more time has to pass in order 
* to negate the score penalty cause{d,s}. 
*/ 
score -= (new Date() - lastact) * 0.05; 

// Score shouldn't be less than zero. 
score = (score < 0) ? 0 : score; 

Затем мы добавим сообщение неустойку и проверить, если он пересекает порог:

if ((score += penalty) > 1000) { 
    // Do things. 
} 

Не следует забывать обновлять последнее действие впоследствии:

lastact = new Date(); 
1

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

В вашем примере, я предполагаю, что это будет что-то вроде:

onSuccess: function(){ _.debounce(someOtherFunction, timeOut)}; 

где timeout максимальная частота, которую вы хотите someOtherFunction называться.

+0

Функция 'onSuccess', которую я использую, довольно сложна и зависит от возвращенных выходов каждой отдельной функции (типы событий, что-то вроде« подключено »,« отключено »и т. Д.). Проверяя исходный код, кажется, что debouncing он вернет «результат последнего вызова func», который может сломать уже хрупкий код. – VariousThings

+1

«Уже хрупкий код»? - Кажется, это время рефакторинга ... :) –

+0

@ma_il: Ха-ха, может быть. Мне пришлось бы изобретать все, и «если это сработает, не исправляйте», то здесь применимо. – VariousThings

1

Я знаю, что вы спросили о родном JavaScript, но, возможно, взгляните на RxJS.

RxJS или Реактивные Расширения для JavaScript библиотека для трансформации, составление и запросов потоков данных. Мы имеем в виду все виды данных , начиная с простых массивов значений, до ряда событий (к сожалению или иначе), до сложных потоков данных.

Существует пример на этой странице, которая использует метод throttle к «Игнорирует значения из наблюдаемой последовательности, которые следуют другому значение перед dueTime» (см source).

keyup = Rx.Observable.fromEvent(input, 'keyup').select(function(ev) { 
      return ev.target.value; 
     }).where(function(text) { 
      return text.length > 2; 
     }).throttle(500) 
     .distinctUntilChanged() 

Там может быть подобным способом получить 2,5-3 в секунду и не игнорировать остальную часть событий до следующей секунды.

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