Asp classic 如何在经典ASP中延迟响应

Asp classic 如何在经典ASP中延迟响应,asp-classic,Asp Classic,我有一个运行经典ASP的站点,在登录页面上,我想延迟对失败登录尝试的响应(大约10秒),以帮助防止对帐户的暴力攻击 谷歌的快速搜索显示了一些使用SQL server查询的黑客行为,这些行为似乎很有品味 在经典asp中有没有一个好方法可以做到这一点?在纯asp中没有简单的方法可以做到这一点。 SQL WAITFOR或在VB(或任何东西)中创建简单的可休眠ActiveX组件。 请注意,这将增加服务器上的负载。休眠请求会使内存和连接白白消耗。有Response.Buffer选项,您可以使用该选项告诉它

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

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


在经典asp中有没有一个好方法可以做到这一点?

在纯asp中没有简单的方法可以做到这一点。
SQL WAITFOR或在VB(或任何东西)中创建简单的可休眠ActiveX组件。

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

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


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

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

Sub DelayResponse(numberOfseconds)
 Dim WshShell
 Set WshShell=Server.CreateObject("WScript.Shell")
 WshShell.Run "waitfor /T " & numberOfSecond & "SignalThatWontHappen", , True
End Sub
有一种用于通用VBScript的方法,但是,它在ASP环境中不起作用

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

请看这里:

具体回答您的以下问题:

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


没有。没有好的方法可以做到这一点,只有“hack tastic”hack可以使用,但是它们会带来各种副作用和警告。(请参阅“如何使我的ASP页面暂停或‘睡眠’?”链接的最后一部分,了解特定的内存消耗、页面错误和恶劣的副作用。)

我不会回答您的特定问题,因为许多人已经这样做了,但有更好的方法来防止暴力攻击

例如:

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


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

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

    您可以使用:

    <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>
    
    
    睡觉
    
    =1然后shell.popup“暂停”,秒,“暂停”,64
    端函数
    %>
    
    我用的是:

    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
    

    拜拜:-)

    回答您问题中的“推迟答复”部分:

    dim SecondsToWait : SecondsToWait = 4
    dim StartTime : StartTime = Time()
    Do Until
       DateDiff("s", StartTime, Time(), 0, 0) > SecondsToWait
    Loop
    
    纯经典ASP,不含SQL和WScript Shell,但仅用于调试延迟目的。这是一个用于测试的片段(非常有用),但它没有解决问题的“好方法”部分


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

    只需重定向到一个随机命名的大映像,该映像的加载时间为所需的秒数。

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

    Sub MyDelay(NumberOfSeconds)
    Dim DateTimeResume
    DateTimeResume= DateAdd("s", NumberOfSeconds, Now())
    Do Until (Now() > DateTimeResume)
    Loop
    End Sub
    
    Call MyDelay(5)
    
    使用以下代码调用此函数

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

    对于使用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
    

    当然还有其他方法,基于IP的阻塞的问题是,大公司的用户通常来自同一IP,因此基于IP的阻塞可能会影响更多的人。源IP可以被伪造,使得这个方法无效。是的,我知道Bert,代理和所有这些,它甚至可以被欺骗。然而,暴力攻击往往也会使用特定的用户名,他们会尝试登录,因此在Y秒内尝试X次登录用户“Admin”,只需告诉他们进行徒步旅行即可。不管是IP还是别的什么。在timespan中对同一用户名的重复登录尝试显然是一个自动的web请求,可以识别这一点。修改了我的答案以反映其中的一些内容。+1,回答不错,尽管我会使用强有力的术语来废弃延迟响应解决方案。每次使用新会话的蛮力攻击都可能与许多并行请求一起执行,因此此类攻击可能会有效地成为非故意的DOS攻击。请学习如何正确格式化代码。它在这里有点重要。这似乎是非常依赖于环境(带宽等),这通常是不需要的。不会等待W10 Pro IIS