代码之家  ›  专栏  ›  技术社区  ›  Onorio Catenacci

如何在经典ASP中延迟响应

  •  7
  • Onorio Catenacci  · 技术社区  · 15 年前

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

    谷歌的快速搜索显示了一些使用SQL server查询的黑客行为,这些行为似乎很有品味。

    13 回复  |  直到 15 年前
        1
  •  8
  •   Wim    15 年前

    我不打算回答你的具体问题,因为许多人已经这样做了,但有更好的方法来防止暴力攻击。

    例如:

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

    只是说,除了锁定一些资源并等待,在服务器上增加不必要的负载之外,还有其他选择。

        2
  •  4
  •   Asa Yeamans    13 年前

    还有另一种方法,但请记住前面提到的关于非自然消耗资源的警告。不过,这里有一个方法

    Sub DelayResponse(numberOfseconds)
     Dim WshShell
     Set WshShell=Server.CreateObject("WScript.Shell")
     WshShell.Run "waitfor /T " & numberOfSecond & "SignalThatWontHappen", , True
    End Sub
    
        3
  •  4
  •   Community CDub    4 年前

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

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

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

    具体回答您的以下问题:

    有没有一个好的方法可以做到这一点

    不,没有 好的

        4
  •  2
  •   Dercsár    15 年前

    在纯ASP中没有简单的方法可以做到这一点。

    请注意,这将增加服务器上的负载。睡眠请求会使内存和连接白白消耗。

        5
  •  2
  •   Guilherme Costa    13 年前

    您可以使用:

    <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>
    
        6
  •  1
  •   Seb    13 年前
    <%
     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
  •  1
  •   Glorfindel Doug L.    5 年前

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

    This is how Google does it

        8
  •  0
  •   glenatron    15 年前

    这里有Response.Buffer选项,您可以使用它来告诉它延迟返回响应,直到页面完成处理,因此您可以将其与脚本中的某种超时结合起来,但它并不是特别优雅,尤其是因为VBScript并没有真正为您提供一种让线程睡眠的方法,这样您就可以结束对CPU的重击。

    也许最好在客户端使用服务器端会话和javascript,这样客户端会延迟请求,而服务器只会在预期延迟结束后发送响应。这应该提供一些服务器端保护,并可用于那些不想干扰您的系统的用户。。。

        9
  •  0
  •   Furio    12 年前

    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
    

    再见:-)

        10
  •  0
  •   AlexLaforge    6 年前

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

    Sub SleepMysql(n)
    
        'Define Query
        Dim SqlStr : SqlStr = "DO SLEEP(" & n & ")"
    
        'Run Query
        Dim rsTemp : Set rsTemp = YourDatabaseConnection.Execute(SqlStr)
    
        'Release resources
        Set rsTemp = Nothing
    
    End Sub 'SleepMysql
    
        11
  •  0
  •   sbgib    3 年前

    在所有的想法中——我喜欢Dersr的答案——以下是我对等待的实现,我发现它很有效。-要求应用程序能够访问SQL server:

    <%
    ' 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 
    %>
    
        12
  •  -1
  •   dakab    11 年前

    针对延迟,请回答您问题的一部分:

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

    . 这是一个用于测试的片段(非常有用),但它没有解决问题的好方法部分 ;-)

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

        13
  •  -1
  •   Musakkhir Sayyed    10 年前

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

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

    Call MyDelay(5)
    
        14
  •  -4
  •   Servy    10 年前

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