2010-02-10 39 views
6

Tengo un sitio ejecutando Classic-ASP y en la página de inicio de sesión me gustaría retrasar la respuesta a un intento fallido de inicio de sesión (por 10 segundos) para ayudar a prevenir ataques de fuerza bruta en las cuentas .Cómo retrasar una respuesta en ASP clásico

Las búsquedas rápidas de Google muestran algunos hacks usando consultas de SQL Server que parecen hack-tastic.

¿Hay alguna manera de hacerlo en el asp clásico?

Respuesta

8

No voy a responder su pregunta específica , como muchos ya lo han hecho, pero hay formas mucho mejores de prevenir ataques de fuerza bruta.

Por ejemplo:

  1. Por qué no bloquear una sesión específica o la dirección IP después de decir 5 (siendo generoso aquí) intentos de conexión fallidos?Puede bloquearlo por digamos 10 minutos. Incluso podría escribir un estado HTTP "401 no autorizado" y luego simplemente finalizar la respuesta con Response.End.
  2. De manera similar, pero ni siquiera vinculada a inicios de sesión fallidos, podría bloquear las solicitudes de la página de inicio de sesión más de X veces en Y segundos para un IP específico, UserAgent y otras características del cliente, asegurando una especie de cliente 'único' .
  3. Ignore la dirección IP (se puede simular fácilmente y puede ser una IP del servidor proxy), y simplemente detecte la automatización del intento de inicio de sesión. X cantidad de inicios de sesión fallidos en Y segundos para un nombre de usuario/dirección de correo electrónico específico, bloquearlo para ese nombre de usuario durante un período de tiempo determinado y finalizar la respuesta.

Solo digo que hay otras opciones aparte de cargar innecesariamente en su servidor al bloquear algunos recursos y esperar.

Obviamente, hacer esto en la capa de hardware - firewalls, etc. sería la opción preferida.

+0

Es cierto que hay otros enfoques, el problema con el bloqueo basado en IP es que a menudo los usuarios en grandes corporaciones van a aparecer venir de la misma IP, por lo que un bloque basado en IP podría afecta a más personas de las deseadas Y la IP de origen simplemente puede ser falsificada, haciendo que este método sea inerte. –

+0

Sí, soy consciente de eso, Bert, proxies y todo eso, e incluso puede ser falsificado. Sin embargo, los ataques de fuerza bruta también suelen usar un nombre de usuario específico, por lo que intentan iniciar sesión, por lo que el inicio de sesión X intenta que el usuario administre el mensaje en 'Y segundos', solo dígales que realicen una caminata. Independientemente de IP o cualquier cosa.Son los reiterados intentos de inicio de sesión para el mismo nombre de usuario en un intervalo de tiempo que es claramente una solicitud web automatizada, que identifica esto. Modifiqué mi respuesta para reflejar algo de esto. –

+0

+1, buena respuesta, aunque usaría términos fuertes para disuadir la solución de respuesta de retraso. Un intento de fuerza bruta usando una sesión nueva cada vez se puede realizar con muchas solicitudes paralelas, por lo tanto, dicho ataque puede convertirse efectivamente en un ataque de DOS no intencionado. – AnthonyWJones

1

No existe una forma sencilla de hacerlo en ASP puro.
SQL WAITFOR, o crea un componente ActiveX simple en VB (o cualquier cosa) que duerma.
Tenga en cuenta que esto aumentará la carga en el servidor. Las solicitudes de sueño mantienen la memoria y las conexiones consumidas por nada.

0

Existe la opción Response.Buffer que puede usar para decirle que demore la devolución de la respuesta hasta que la página haya completado el procesamiento, por lo que podría combinarla con algún tipo de tiempo de espera en el script, pero no sería especialmente elegante, especialmente porque VBScript realmente no te ofrece una forma de pedir hilos para que puedas dormir, así puedes terminar golpeando la CPU.

Quizás sea mejor utilizar una sesión del lado del servidor y javascript en el cliente, por lo que el cliente retrasa la solicitud y el servidor solo enviará la respuesta una vez que se haya producido el retraso esperado. Eso debería proporcionar algunas protecciones del lado del servidor y ser utilizable para los usuarios que no están tratando de meterse con su sistema ...

4

Hay otro enfoque, pero tenga en cuenta las advertencias antes mencionadas sobre los recursos consumidos de manera poco frecuente. Aquí es un enfoque embargo

Sub DelayResponse(numberOfseconds) 
Dim WshShell 
Set WshShell=Server.CreateObject("WScript.Shell") 
WshShell.Run "waitfor /T " & numberOfSecond & "SignalThatWontHappen", , True 
End Sub 
+1

no esperará el W10 favorable IIS –

2

No es el método WScript.Sleep para los fines generales de VBScript, sin embargo, esto no funciona en el contexto de la ASP.

Existen varios otros mecanismos que puede utilizar para lograr esto, sin embargo, todos son efectivamente "soluciones provisionales" ya que no existe una forma integrada de causar una página ASP (ejecutando VBScript) para detenerse a sí mismo.

Ver aquí:

How do I make my ASP page pause or 'sleep'?

Para responder específicamente a su pregunta de:

¿Hay una buena manera de hacer esto en ASP clásico?

No. No hay buena manera de hacer esto, y sólo hay los hacks "hack-tastic" que se pueden utilizar, sin embargo, traen consigo todo tipo de efectos secundarios y advertencias. (Consulte la última parte del enlace "¿Cómo hago que pause mi página ASP o duerma?" Para obtener información específica sobre cómo comer en la memoria, página que produce fallas en el efecto secundario desagradable.)

2

que puede utilizar:

<html> 
<head> 
    <title>Sleep</title> 
</head> 
<body> 
    <% 

     function Sleep(seconds) 
      set oShell = CreateObject("Wscript.Shell") 
      cmd = "%COMSPEC% /c timeout " & seconds & " /nobreak" 
      oShell.Run cmd,0,1 
     End function 

     Sleep(5) 

     response.write("End") 
    %> 
</body> 
</html> 
+0

Éste funciona en W10 Pro –

1
<% 
set shell = CreateObject("WScript.Shell") 


t1 = timer() 
sleep(5) 
t2 = timer() 

response.write "waited "& t2-t1 &" secs" 


function sleep(seconds) 
    if seconds>=1 then shell.popup "pausing",seconds,"pause",64 
end function 
%> 
+0

. Aprenda a formatear su código correctamente. Es algo importante aquí. – Will

0

estoy usando esto:

function sleep(scs) 
    Dim lo_wsh, ls_cmd 
    Set lo_wsh = CreateObject("WScript.Shell") 
    ls_cmd = "%COMSPEC% /c ping -n " & 1 + scs & " 127.0.0.1>nul" 
    lo_wsh.Run ls_cmd, 0, True 
End Function 

sleep(5) 'wait for 5 seconds 

bye :-)

-1

En respuesta a la “demora la respuesta "parte de ti" ur pregunta:

dim SecondsToWait : SecondsToWait = 4 
dim StartTime : StartTime = Time() 
Do Until 
    DateDiff("s", StartTime, Time(), 0, 0) > SecondsToWait 
Loop 

ASP clásico puro y sin SQL y WScriptl Shell, pero para fines de depuración de retardo solamente. Este es un fragmento de la prueba (muy helupful), pero no se ocupa de la parte “buena manera” de su pregunta ;-)

esta respuesta para el bien de la integridad y para personas que buscan retrasos (depuración). Los intentos fallidos de inicio de sesión no deberían manejarse así.

-4

Simplemente redirija a una imagen grande con un nombre aleatorio que tarda la cantidad deseada de segundos en cargarse.

+0

Esto parece ser muy dependiente del entorno (ancho de banda, etc.) que, en general, no se desea. – TobiMcNamobi

-1

Otra forma de retrasar la respuesta de asp mediante este código.

Sub MyDelay(NumberOfSeconds) 
Dim DateTimeResume 
DateTimeResume= DateAdd("s", NumberOfSeconds, Now()) 
Do Until (Now() > DateTimeResume) 
Loop 
End Sub 

Llamar a esta función utilizando este código.

Call MyDelay(5)