如何在Classic ASP中延迟响应

时间:2010-02-10 14:18:29

标签: asp-classic

我有一个运行Classic-ASP的站点,并且在登录页面上我想延迟对失败的登录尝试的响应(大约10秒),以帮助防止对账户的暴力攻击。

快速谷歌搜索显示一些使用SQL服务器查询的黑客攻击。

在经典的asp中有没有好的方法呢?

14 个答案:

答案 0 :(得分:8)

我不会像许多人已经这样做的那样回答你的具体问题,但是有更好的方法可以防止暴力攻击。

例如:

  1. 为什么不在说5(这里很慷慨)失败的登录尝试后锁定特定的会话或IP地址?你可以把它锁定10分钟。您甚至可以编写“401 Unauthorized”HTTP状态,然后使用Response.End结束响应。
  2. 以类似的方式,但甚至没有链接到失败的登录,您可以在Y秒内阻止对登录页面的请求超过特定IP,UserAgent和其他客户端功能的X次 - 确保“独特”客户端的类型
  3. 忽略IP地址(它很容易被欺骗,可以是代理服务器IP),只需检测登录尝试的自动化。对于特定用户名/电子邮件地址,在Y秒内登录失败的X次数,在设定的时间段内为该用户名阻止,并结束响应。
  4. 只是说除了通过锁定一些资源并等待在服务器上施加不必要的负载之外还有其他选择。

    显然,在硬件层执行此操作 - 防火墙等将是首选选项。

答案 1 :(得分:4)

还有另一种方法,但请记住前面提到的有关无意识消耗资源的警告。这是一种方法

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

答案 2 :(得分:3)

通用VBScript有WScript.Sleep方法,但是这在ASP的上下文中不起作用。

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

见这里:

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

专门回答您的问题:

  

有没有一种好方法可以做到这一点   经典的asp?

没有。没有良好的方法可以做到这一点,而且只有“hack-tastic”黑客可以使用,但是它们会带来各种副作用和警告。 (请参阅“如何使我的ASP页面暂停或'睡眠'?”链接的最后一部分,以获取特定内存,页面错误的副作用。)

答案 3 :(得分: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>

答案 4 :(得分:1)

纯ASP中没有简单的方法 SQL WAITFOR,或者在VB(或任何东西)中创建简单的ActiveX组件 请注意,这将增加服务器上的负载。睡眠请求会使内存和连接消耗殆尽。

答案 5 :(得分:1)

在不使用IP限制的情况下避免暴力攻击的其他方法是在对同一用户进行第二次失败尝试后提供验证码。这就是谷歌的做法。

This is how Google does it http://img692.imageshack.us/img692/3231/capturecy.jpg

答案 6 :(得分: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
%>

答案 7 :(得分:0)

您可以使用Response.Buffer选项告诉它延迟返回响应,直到页面完成处理,因此您可以将其与脚本中的某种超时相结合,但它不会特别优雅,特别是因为VBScript并没有真正为你提供一种让线程处于睡眠状态的方法,所以你最终可能会破坏CPU。

也许最好在客户端上使用服务器端会话和javascript,因此客户端会延迟请求,服务器只会在预期的延迟结束后发送响应。这应该提供一些服务器端保护措施,并且可以用于那些不想弄乱你的系统的用户...

答案 8 :(得分: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
再见: - )

答案 9 :(得分:0)

对于使用MySQL的用户,您可以执行以下操作:

HUB_HOST=localhost

答案 10 :(得分:0)

在所有想法中 - 我喜欢 Dercsár 的回答 - 这是我发现运行良好的等待的实现。 - 要求您的应用程序有权访问 SQL 服务器:

<%
' ASP Script to example to wait  
  
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open strConnString    ' your connection to sql server here...

Response.write("Waiting for 15 seconds...." & now() & "<BR>")  
Call subWaitTime("00:00:15")  
' Wait 15 seconds 
Response.write("ok - Done" & now() & "<BR>") 
conn.close 
set conn = nothing
    
    
 '---- Utility sub to wait 
 Sub subWaitTime(sTime)
    ' Call subWaitTime with number of Hours:Minutes:Seconds to delay
    sqlWaitTime = "WAITFOR DELAY " & fnSqlStr(sTime)
    conn.Execute(sqlWaitTime)      ' 
 End Sub 
%>

答案 11 :(得分:-1)

回应问题的“延迟回复”部分:

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

不带SQL和WScript Shell的Pure Classic ASP,但仅用于调试延迟。这是一个测试片段(非常笨拙),但它没有解决问题的“好方法”部分;-)

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

答案 12 :(得分:-1)

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

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

使用此代码调用此函数。

Call MyDelay(5)

答案 13 :(得分:-4)

只需重定向到随机命名的大图片即可加载所需的秒数。