2012-02-24 10 views
8

Alguien me hizo consciente de algunos defectos en una aplicación que estoy trabajando (en su mayoría dentro de mi código JavaScript en el front-end), que deja abierta la posibilidad de, por ejemplo, al hacer clic una tonelada de botones a la vez y enviando una tonelada de correos electrónicos transaccionales. Esto claramente no es bueno.Limitación de velocidad para evitar un comportamiento malicioso en ExpressJS

Creo que una manera de manejar esto en ExpressJS es mediante el uso de app.all() para contar el número de solicitudes que se producen dentro de un cierto periodo de tiempo. Guardaría esto en los metadatos de la sesión con marcas de tiempo, y si ocurren más de X solicitudes en el tiempo Y, las cortaré por un tiempo hasta que expire el límite.

¿Alguien ha hecho esto antes o tiene alguna sugerencia/pista para ayudarme? Algo que es fácil ingresar y salir de mi aplicación es preferible. ¡Gracias!

+1

La mejor manera de manejar esto es para asegurarse de que los correos electrónicos son o no bloqueo y no transaccional. – Raynos

Respuesta

2

Usted puede utilizar el objeto Collate en su página web.

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

Si desea que una función se ejecute una vez y no se vuelva a ejecutar en el siguiente 1 segundo. Al igual que si se quiere evitar que el usuario envía un formulario en muchas ocasiones, esto se hace:

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

Si espera un evento para disparar varias veces y sólo quieren reaccionar a la última vez que se dispara. Al igual que si desea buscar después de que un usuario haya terminado de escribir, hacer esto:

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

Una solución del lado del cliente como esta solo funcionaría para evitar acciones accidentales por parte de un usuario, pero no necesariamente acciones de un usuario "malicioso" (podrían enviar los mensajes POST y GET manualmente). – Kitsune

Cuestiones relacionadas