Сценарий внедрения SQL - PullRequest
       40

Сценарий внедрения SQL

2 голосов
/ 27 сентября 2011

Может показаться, что этот заголовок вопроса был задан ранее и получен ответ, но для меня это другой сценарий.Я использую этот скрипт, чтобы остановить инъекцию sql в мой сайт ASP.Согласно моему знанию или инъекционному сценарию я попробовал все.Возможно ли все-таки прорваться через этот код или вы чувствуете, что это нормально?

Вот сценарий

<%
Function IsInject(strCheck, boolForm)
    IsInject = False
    If Not boolForm And Len(strCheck) > 50 Then IsInject = True
'   Dim sCmdList, arrCmds, i
    If boolForm Then
        sCmdList = "declare,varchar,convert,delete,create,is_srvrolemember,ar(,cast("
    Else
        sCmdList = "update,union,select,drop,declare,varchar,convert,delete,create,is_srvrolemember,ar(,cast(,char("
    End If
    arrCmds = Split(sCmdList, ",")
    For i = 0 To UBound(arrCmds)
        If Instr(UCase(CStr(strCheck)), UCase(arrCmds(i))) > 0 Then
            IsInject = True
            Exit For
        End If
    Next
    Erase arrCmds
End Function
Function CleanInject(strClean, boolInt)
    If boolInt Then CleanInject = CInt(strClean) Else CleanInject = Replace(strClean, "'", "''")
End Function

'-----------------------------------------------------------
'redirect user if specific IP
'Dim ipaddress, bFBIRedirect, sInjectType
bFBIRedirect = True
ipaddress = Request.ServerVariables("REMOTE_ADDR")
Select Case ipaddress
    Case "90.120.206.10"
    Case Else
        bFBIRedirect = False
End Select
If bFBIRedirect Then Response.Redirect "http://www.fbi.gov"
'-----------------------------------------------------------

'Dim bIsInject, sHackString
bIsInject = False

If Not bInject Then
'   Dim qsItm
    For Each qsItm In Request.QueryString
        If IsInject(Request.QueryString(qsItm), False) Then
            bIsInject = True
            sHackString = qsItm & "=" & Request.QueryString(qsItm)
            sHackType = "QueryString"
            sInjectType = "qs-" & Request.QueryString(qsItm)
            Exit For
        End If
    Next
End If
If Not bInject Then
'   Dim frmItm
'   For Each frmItm In Request.Form
'       If IsInject(Request.Form(frmItm), True) Then
'           bIsInject = True
'           sHackString = Request.Form(frmItm)
'           sHackString = frmItm & "=" & Request.Form(frmItm)
'           sHackType = "Form"
'           Exit For
'       End If
'   Next
End If

If bIsInject Then
    Session("hacktype") = sHackType
    Session("hackstr") = sHackString
    Session("thepagefrom") = Request.ServerVariables("PATH_INFO")
    Session("theip") = Request.ServerVariables("REMOTE_ADDR")

'   Dim arrWhereAt, iWhereAt, sRedirect

    arrWhereAt = Split(Request.ServerVariables("PATH_INFO"), "/")
    iWhereAt = UBound(arrWhereAt)

    sRedirect = "unknownerror.asp?ip=" & Request.ServerVariables("REMOTE_ADDR") & "&err=" & sInjectType & "&pg=" & Request.ServerVariables("PATH_INFO")
    If iWhereAt = 1 Then sRedirect = "../" & sRedirect
    If iWhereAt = 2 Then sRedirect = "../../" & sRedirect
    If iWhereAt = 3 Then sRedirect = "../../../" & sRedirect

    Response.Redirect sRedirect
End If
%>

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Использование черных списков для удаления команд не очень хорошая идея. Вы должны убедиться, что вы охватили все возможные команды, и все же кто-то может пробраться мимо. Это также, вероятно, завершится ошибкой, если вы получите данные от пользователя, который не является атакой, но все еще содержит строку атаки. Пример "Назад во времена Советского Союза".

Как предполагает Николай, посмотрите, можете ли вы найти какой-то тип подготовленных утверждений для использования. Или найдите действительно хорошую библиотеку для правильного экранирования данных.

1 голос
/ 27 сентября 2011

Вместо этого, я думаю, я бы использовал объект ADO Parameter при создании SQL-запросов, во-вторых, лучше всего выполнить преобразование типов полей ввода для динамических SQL-запросов, таких как преобразование строк в строки SQL (замените любые 'на два ''), убедившись, что число - это число и т. д.

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