Как отложить ответ в Classic ASP - PullRequest
7 голосов
/ 10 февраля 2010

У меня есть сайт, на котором работает Classic-ASP, и на странице входа в систему я хотел бы отложить ответ на неудачную попытку входа (примерно на 10 секунд), чтобы помочь предотвратить атаки методом подбора по учетным записям.

Быстрый поиск в Google показывает некоторые хаки с использованием запросов к SQL-серверу, которые кажутся хакерскими.

Есть ли хороший способ сделать это в классическом asp?

Ответы [ 13 ]

8 голосов
/ 10 февраля 2010

Я не собираюсь отвечать на ваш конкретный вопрос, так как многие уже сделали это, но есть гораздо лучшие способы предотвращения атак грубой силой.

Например:

  1. Почему бы не заблокировать определенный сеанс или IP-адрес после того, как, скажем, 5 (здесь достаточно щедрых) неудачных попыток входа в систему? Вы можете заблокировать это, скажем, на 10 минут. Вы можете даже написать «401 Несанкционированный» статус HTTP, а затем просто завершить ответ Response.End.
  2. Подобным образом, но даже не связанный с неудачными входами в систему, вы могли блокировать запросы на страницу входа более чем X раз в течение Y секунд для определенного IP, UserAgent и других клиентских функций - обеспечивая своего рода «уникальный» клиент .
  3. Игнорировать IP-адрес (он легко подделывается и может быть IP-адресом прокси-сервера) и просто обнаруживать автоматизацию попытки входа в систему. X количество неудачных входов в систему в течение Y секунд для определенного имени пользователя / адреса электронной почты, блокирование его для этого имени пользователя на определенный период времени и завершение ответа.

Просто скажу, что есть и другие варианты, кроме ненужной загрузки вашего сервера путем блокировки некоторых ресурсов и ожидания.

Очевидно, что делать это на аппаратном уровне - брандмауэры и т. Д. Было бы предпочтительным вариантом.

4 голосов
/ 10 февраля 2010

Существует другой подход, но имейте в виду вышеупомянутые предостережения относительно неоправданно потребляемых ресурсов. Вот подход, хотя

Sub DelayResponse(numberOfseconds)
 Dim WshShell
 Set WshShell=Server.CreateObject("WScript.Shell")
 WshShell.Run "waitfor /T " & numberOfSecond & "SignalThatWontHappen", , True
End Sub
3 голосов
/ 10 февраля 2010

Для VBScript общего назначения существует метод WScript.Sleep , однако он не будет работать в контексте ASP.

Существует ряд других механизмов, которые можно использовать для достижения этой цели, однако все они фактически являются «обходными путями», поскольку нет встроенного способа, позволяющего чисто заставить ASP-страницу (работающую на VBScript) приостанавливать себя.

Смотрите здесь:

Как сделать так, чтобы моя страница ASP приостанавливалась или «спала»?

Чтобы конкретно ответить на ваш вопрос:

Есть ли хороший способ сделать это в классическая осина?

Нет. Нет хороших способов сделать это, и есть только «взломанные» хаки, которые можно использовать, однако они приносят с собой всевозможные побочные эффекты и предостережения. (См. Последнюю часть ссылки «Как сделать так, чтобы моя страница ASP приостанавливалась или« спала »?», Чтобы узнать конкретное поглощение памяти, вызывающее неприятные побочные эффекты.)

2 голосов
/ 27 апреля 2012

Вы можете использовать:

<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 голос
/ 30 апреля 2012
<%
 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
%>
1 голос
/ 10 февраля 2010

Другой подход, позволяющий избежать атак методом "грубой силы" без использования ограничений IP, состоит в том, чтобы предлагать капчу после второй неудачной попытки для того же пользователя. Так Google это делает.

This is how Google does it

1 голос
/ 10 февраля 2010

Нет простого способа сделать это в чистом ASP.
Либо SQL WAITFOR, либо создайте простой компонент ActiveX в VB (или что-нибудь еще), который спит.
Обратите внимание, что это увеличит нагрузку на сервер. Спящие запросы сохраняют память и соединения, потраченные впустую.

0 голосов
/ 27 августа 2018

Для тех, кто использует 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
0 голосов
/ 27 апреля 2015

Другой способ, которым вы можете отложить ответ на asp, используя этот код.

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

Вызовите эту функцию, используя этот код.

Call MyDelay(5)
0 голосов
/ 28 января 2015

Просто перенаправьте на случайное имя большого изображения, для загрузки которого требуется желаемое количество секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...