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의 및 소호 - 대시 라이브러리 (어쩌면 그들은 몇 가지 흥미로운 방법을 제공)을 사용하는 것이 추가하고 싶습니다하지만,이 네이티브 JS를 사용하여 수행 할 수 있다면 바람직 할 것이다.

어떤 통찰력이라도 대단히 감사합니다! 특정 자바 스크립트 함수 화재 주파수 염려되는 경우

+0

그것은 가능성이 높습니다 누군가가 스팸 메일 경우 있음을 그들이 브라우저를 사용하지 않는 사이트 (즉, 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

, 당신은 기능을 debounce 수 있습니다. timeout는 최대 주파수가

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

당신이 someOtherFunction가 호출하려는 당신의 예에서

, 나는이 같은 일 것 같아요.

+0

'onSuccess' 함수 저는 꽤 복잡하며 각 개별 함수 (이벤트 유형, "connected", "disconnected"등과 같은 것)의 반환 된 출력에 의존합니다. 소스 코드를 확인해 보면 디버깅하면 "마지막 func 호출의 결과"가 반환되어 이미 깨지기 쉬운 코드가 손상 될 수 있습니다. – VariousThings

+1

"이미 깨지기 쉬운 코드"? - 리팩토링 시간 인 것 같은데 ... :) –

+0

@ma_il : 하하, 아마도. 나는 모든 것을 재발 명해야하고 "효과가 있다면 그것을 고치지 마라"라는 말이 여기에 적용됩니다. – VariousThings

1

난 당신 네이티브 자바 스크립트에 대해 질문 알고 있지만, 어쩌면 RxJS를보십시오.

JavaScript 용 RxJS 또는 Reactive Extensions는 데이터 스트림을 변환, 작성 및 쿼리하기위한 라이브러리입니다. 우리는 값의 단순 배열, 데이터의 복잡한 흐름에 이벤트 (불행한 또는 기타)의 시리즈로도 모든 데이터 종류를 의미한다.

은 (source 참조) "dueTime 전에 다른 값에 따른다 관찰 시퀀스의 값을 무시한다"는 throttle 방법을 사용하는 페이지의 일례가있다.

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를 얻고 다음 초까지 사건의 나머지 부분을 무시하는 비슷한 방법이있을 수 있습니다.