2012-02-24 3 views
8

누군가가 내가 작업하고있는 응용 프로그램의 일부 결함 (대부분 프론트 엔드의 JavaScript)을 인식하고 톤을 클릭 할 가능성을 열어 둡니다. 한 번에 버튼을 클릭하고 트랜잭션 전자 메일을 대량 발송합니다. 이것은 분명히 좋지 않습니다.ExpressJS의 악의적 인 행동을 막기위한 속도 제한

ExpressJS에서이 문제를 처리하는 한 가지 방법은 app.all()을 사용하여 특정 기간 내에 발생하는 요청 수를 계산하는 것입니다. 타임 스탬프가있는 세션 메타 데이터에이 값을 저장하고, Y 요청보다 많은 요청이 Y 시간에 발생하면 제한 시간이 만료 될 때까지 잠시 중단합니다.

누구나 전에이 작업을 수행했거나 나를 도울 수있는 힌트가 있습니까? 내 앱을 들락날락하게 만드는 것이 바람직합니다. 감사!

+1

이 처리하는 가장 좋은 방법은 이메일이 아닌 차단 및 거래되지 중 하나입니다 있는지 확인하는 것입니다. – Raynos

답변

2

웹 페이지에 Collate 개체를 사용할 수 있습니다.

function Collate(timeout) { 
    this.timeout = timeout || 1000; 
} 
Collate.prototype = { 
    time: 0, 

    idle: function() { 
    var t = new Date().getTime(); 
    return (t - this.time > this.timeout && (this.time = t)); 
    }, 

    prefer: function(func) { 
    this.func = func; 
    clearTimeout(this.timer); 
    this.timer = setTimeout(func, this.timeout); 
    } 
}; 

기능을 한 번 실행하고 다음 1 초 이내에 다시 실행하지 않으려는 경우. 폼을 여러 번 제출에서 사용자를 방지하려는 경우, 당신이처럼이 :

var timer = new Collate(3000); //3 seconds 
button1.onclick = function() { 
    if(timer.idle()) { 
     button1.form.submit(); 
    } else alert("Don't click too quickly!"); 
} 

//or on the form tag 

<script>var submitTimer = new Collate(3000);</script> 
<form action="post" onsubmit="return submitTimer.idle();"> 

당신이 이벤트가 여러 번 화재 만이 화재 마지막에 반응 할 것으로 예상하는 경우

. 는 사용자가 입력을 완료 한 후 검색 할 경우, 당신이처럼이 :

var timer = new Collate(700); //0.7 seconds 
textfield1.onkeyup = function() { 
    timer.prefer(function() { 
     autocomplete.search(textfield1.value); 
    }); 
}; 
+4

이와 같은 클라이언트 측 솔루션은 사용자의 우발적 인 행동을 방지하기 위해 작동하지만 반드시 '잘못된'사용자의 행동 (POST 및 GET을 수동으로 보낼 수는 없음)이 필요하지는 않습니다. – Kitsune