2010-02-10 44 views
6

我有一个运行Classic-ASP的站点,并且在登录页面上我想延迟对失败登录尝试(类似于10秒)的响应,以帮助防止对帐户进行强力攻击。如何延迟经典ASP中的响应

快速谷歌搜索显示一些使用SQL服务器查询看起来破解的黑客。

有没有一种很好的方法来做到这一点在经典的ASP?

回答

8

我不打算回答您的具体问题,正如很多人已经这样做了,但是防止暴力攻击的方法有很多。

例如:

  1. 为什么不锁定特定会话或IP地址进行后说5(在这儿大方)失败的登录尝试?你可以锁定它说10分钟。你甚至可以写一个“401 Unauthorized”的HTTP状态,然后直接用Response.End来结束响应。
  2. 以类似的方式,但甚至没有链接到失败的登录,您可以在Y秒内为特定的IP,UserAgent和其他客户端功能阻止对登录页面的请求超过X次 - 确保一种“唯一”客户端。
  3. 忽略IP地址(它很容易被欺骗,可能是代理服务器IP),并且只是检测登录尝试的自动化。在特定用户名/电子邮件地址的Y秒内发生X次失败登录,在该设定的时间段内将该用户名阻止,并结束响应。

只是说有其他选择,通过锁定一些资源并等待,将不必要的负载加载到您的服务器上。

显然,在硬件层 - 防火墙等这样做是首选的选择。

+0

等待当然还有其它的方法,与基于IP阻塞的问题是,用户常常在大公司将显示为来自同一IP的到来,使基于IP块可能影响比预期更多的人。源IP可以简单地伪造,使这种方法呈惰性。 – 2010-02-10 16:21:34

+0

是的,我知道Bert,代理人和所有这些,甚至可以被欺骗。然而,蛮力攻击往往也使用特定的用户名,为此他们尝试登录,所以X登录在Y秒内尝试用户'管理员',只是告诉他们去徒步旅行。无论IP或任何东西。这是在一个时间范围内重复登录同一用户名的尝试,这显然是一个自动化的Web请求,可以识别这一点。修改我的答案以反映这一点。 – 2010-02-10 17:04:59

+0

+1,很好的答案,但我会用强烈的术语来说明延迟响应解决方案。每次使用新会话的强力尝试都可以用许多并行请求来执行,因此这样的攻击可能实际上成为意外的DOS攻击。 – AnthonyWJones 2010-02-11 10:09:13

1

在纯ASP中没有简单的方法。
SQL WAITFOR,或在VB中创建简单的ActiveX组件(或任何其他)睡觉。
请注意,这会增加服务器上的负载。沉睡的请求使内存和连接消耗无用。

0

有Response.Buffer选项,你可以用它来告诉它延迟返回响应,直到页面完成处理,所以你也许可以结合脚本中的某种超时,但它不会尤其是优雅的,特别是VBScript并没有真正为你提供一种让线程进入睡眠的方式,所以你最终可能会颠簸CPU。

也许最好在客户端使用服务器端会话和javascript,所以客户端会延迟请求,服务器只会在预期延迟结束后发送响应。这应该提供一些服务器端的安全措施,并且可以用于那些不试图混淆你的系统的用户...

4

还有另一种方法,但要记住上述关于国内消耗资源的警告。这里是一个办法,虽然

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

不会对W10 Pro的IIS – 2017-03-08 12:38:36

2

有通用VBScript中WScript.Sleep方法,但是,这并不会在ASP的环境中工作。

有许多其他机制可以用来实现这一点,但是,它们都是有效的“解决方法”,因为没有内建的方法可以干净地导致ASP页面(运行VBScript)自行暂停。

在这里看到:

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

具体回答您的问题:

是否有 传统的ASP来做到这一点的好办法?

号有这样做没有方式,只有有可使用的“下锅tastic”黑客,但是他们带来的种种副作用和注意事项。 (请参阅“如何让我的ASP页面暂停或'睡眠'?”链接用于特定的内存吃饭,页面错误令人讨厌的副作用)

2

您可以使用:

<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

这一个适用于W10 Pro – 2017-03-08 12:42:21

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

请学习如何正确格式化您的代码。这里很重要。 – Will 2012-04-30 13:29:40

0

我使用这个:

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 

再见:-)

-1

为响应“延迟回应“的一部分哟乌尔问题:

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

纯传统的ASP没有SQL和WScript的壳牌,但调试延迟仅供参考。这是测试的一个片段(非常有趣),但它没有解决你的问题的“好方法”部分;-)

这个答案为了完整性和寻找(调试)延迟的人。失败的登录尝试不应该像这样处理。

-4

只是重定向到一个随机命名的大图像,需要加载所需的秒数。

+0

这似乎是非常依赖于环境(带宽等),这通常是不期望的。 – TobiMcNamobi 2015-01-28 15:52:38

-1

通过使用此代码可以延迟asp响应的另一种方法。

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

使用此代码调用此函数。

Call MyDelay(5)