2012-02-24 34 views
8

Một người nào đó khiến tôi nhận thấy một số lỗi trong ứng dụng tôi đang làm việc (chủ yếu là trong JavaScript của tôi trên giao diện người dùng), để mở khả năng các nút cùng một lúc và gửi ra một tấn email giao dịch. Điều này rõ ràng là không tốt.Giới hạn tốc độ để ngăn chặn hành vi nguy hiểm trong ExpressJS

Tôi nghĩ một cách để xử lý điều này trong ExpressJS là sử dụng app.all() để đếm số lượng yêu cầu xảy ra trong một khoảng thời gian nhất định. Tôi sẽ lưu trữ điều này trong siêu dữ liệu phiên với dấu thời gian và nếu nhiều hơn X yêu cầu xảy ra trong thời gian Y, tôi sẽ cắt chúng một lúc cho đến khi hết hạn.

Có ai đã làm điều này trước hoặc có bất kỳ mẹo/gợi ý nào để giúp tôi không? Cái gì đó dễ dàng để thả vào và ra khỏi ứng dụng của tôi là thích hợp hơn. Cảm ơn!

+1

Cách tốt nhất để xử lý việc này là đảm bảo email không bị chặn và không giao dịch. – Raynos

Trả lời

2

Bạn có thể sử dụng đối tượng Collate trong trang web của mình.

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); 
    } 
}; 

Nếu bạn muốn chức năng chạy một lần và không chạy lại trong vòng 1 giây tiếp theo. Giống như nếu bạn muốn ngăn chặn người dùng gửi một hình thức nhiều lần, bạn làm như sau:

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();"> 

Nếu bạn mong đợi một sự kiện để bắn nhiều lần và chỉ muốn phản ứng với lần cuối cùng nó cháy. Giống như nếu bạn muốn tìm kiếm sau khi người dùng nhập xong, bạn thực hiện việc này:

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

Một giải pháp phía máy khách như thế này sẽ chỉ hoạt động để ngăn chặn hành động ngẫu nhiên của người dùng, nhưng không nhất thiết là hành động của người dùng 'malcious' (họ chỉ có thể gửi POST và GET theo cách thủ công). – Kitsune

Các vấn đề liên quan