Достаточно ли этого, чтобы обезопасить себя от SQL-инъекций?

Я пытаюсь защитить старый классический веб-сайт asp (который имеет около 1000 (.asp) страниц) с помощью MS SQL 2008 R2 (Express Edition).

Я нашел код (см. Ниже) о том, как параметризованные запросы, и этот код мне кажется наиболее простым для понимания и использования на всех страницах, которые необходимо изменить.

Мой вопрос: если бы я должен был преобразовать все запросы ms sql (которые будут выглядеть примерно так, как код ниже), будет ли этого достаточно для защиты от атаки ms sql-инъекции? или мне нужно будет что-то добавить / изменить?

Спасибо за любую помощь ...

ВОТ КОД:

    set objCommand = Server.CreateObject("ADODB.Command")  
    strSql = "SELECT * FROM users WHERE username=? AND password=?"
    ...  
    cmd1.Parameters(0) = Request.Form("login")
    cmd1.Parameters(1) = Request.Form("password")
    ... 

person compcobalt    schedule 01.08.2012    source источник
comment
Это должно работать, если речь идет о внедрении SQL. Я по-прежнему поклонник хранимых процедур и именованных параметров. SP предоставляют четко определенный интерфейс и, как объекты БД, могут иметь защиту. Явное определение параметров и их типов данных помогает определить интерфейс. Значения по умолчанию для параметров могут быть предоставлены, и проверка выполняется в SP.   -  person HABO    schedule 02.08.2012
comment
@HABO будет ли код, предоставленный kd7 (см. Ответ №2 ниже), устранит все проблемы или все еще есть дыры, которые могут привести к проблеме? (Извините, я знаю, что это, вероятно, вопрос новичка, но я просто хочу понять, что мне нужно сделать, чтобы сделать это безопасное веб-приложение. И начать изменять более 1000 страниц) Большое спасибо ...   -  person compcobalt    schedule 02.08.2012
comment
Это будет работать для простого веб-сайта, но станет головной болью при обслуживании в более крупных средах. Частично проблема заключается в том, что повсюду разбросаны маленькие фрагменты SQL. То, что должно быть незначительным изменением базы данных и обновленными SP, превращается в охоту за всеми местами, которые содержат SQL, или построение его на лету. План выполнения для SP сохраняется и повторно используется при каждом вызове (если вы не укажете WITH RECOMPILE). Обычно это улучшает производительность. SP может предоставить ограниченный доступ к данным, к которым вызывающий не может получить доступ в противном случае, что важно в больших проектах с несколькими приложениями.   -  person HABO    schedule 02.08.2012
comment
@HABO Большое спасибо за вклад, не могли бы вы направить меня к учебнику или чему-то, что вы одобряете для меня (нуб во всем этом), чтобы прочитать, какой-нибудь материал, который я могу понять? Большое вам спасибо за все, HABO.   -  person compcobalt    schedule 02.08.2012
comment
Вы здесь. Попробуйте здесь и здесь. Расширенные темы безопасности SQL. Альтернативная точка зрения. Проблема обслуживания зависит от опыта и вашей среды.   -  person HABO    schedule 02.08.2012


Ответы (2)


Прошло некоторое время с тех пор, как я видел старый синтаксис команды Adodb, но я думаю, вам понадобится что-то вроде:

set objCommand = Server.CreateObject("ADODB.Command")
strSql = "Select * From users where username=@username and password=@password"
objCommand.Parameters.Append.CreateParameter
         ("@username", adVarChar, adParamInput, 50, Request.Form("login"))
objCommand.Parameters.Append.CreateParameter
         ("@password", adVarChar, adParamInput, 50, Request.Form("password"))

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

person Ta01    schedule 01.08.2012
comment
Большое спасибо за приведенный выше пример, он действительно помогает мне лучше понять, как это сделать. Я полный новичок в этом, но я хочу понять, как это работает, поэтому я всегда делаю все правильно. - person compcobalt; 02.08.2012

Да, код, который вы указали в своем вопросе, защищен от инъекций Sql.

Однако , как было отмечено в этой статье о предотвращении внедрения Sql, ваш код будет иметь" незначительную проблему с производительностью, потому что ADODB придется выполнить обход SQL, чтобы выяснить, тип параметра, прежде чем он сможет выполнить запрос ".

Вы можете решить эту проблему, явно указав тип параметра в своем коде с помощью CreateParameter

person Michael Fredrickson    schedule 01.08.2012