Asp classic 如何在经典ASP中延迟响应
我有一个运行经典ASP的站点,在登录页面上,我想延迟对失败登录尝试的响应(大约10秒),以帮助防止对帐户的暴力攻击 谷歌的快速搜索显示了一些使用SQL server查询的黑客行为,这些行为似乎很有品味Asp classic 如何在经典ASP中延迟响应,asp-classic,Asp Classic,我有一个运行经典ASP的站点,在登录页面上,我想延迟对失败登录尝试的响应(大约10秒),以帮助防止对帐户的暴力攻击 谷歌的快速搜索显示了一些使用SQL server查询的黑客行为,这些行为似乎很有品味 在经典asp中有没有一个好方法可以做到这一点?在纯asp中没有简单的方法可以做到这一点。 SQL WAITFOR或在VB(或任何东西)中创建简单的可休眠ActiveX组件。 请注意,这将增加服务器上的负载。休眠请求会使内存和连接白白消耗。有Response.Buffer选项,您可以使用该选项告诉它
在经典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页面暂停或‘睡眠’?”链接的最后一部分,了解特定的内存消耗、页面错误和恶劣的副作用。)我不会回答您的特定问题,因为许多人已经这样做了,但有更好的方法来防止暴力攻击 例如:
response.end
结束响应显然,在硬件层(防火墙等)执行此操作是首选选项。避免暴力攻击而不使用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