Являются ли SQL-инъекции только угрозой для страницы, которая имеет форму? - PullRequest
10 голосов
/ 11 ноября 2009

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

Если вы делаете запрос на странице, нужно ли беспокоиться о атаках с использованием SQL-инъекций? Или это только проблема, когда вы спрашиваете пользователя о вводе?

Спасибо!

Ответы [ 13 ]

15 голосов
/ 11 ноября 2009

Вам не нужно вводить пользователя, чтобы перенести атаку SQL-инъекцией.

Допустим, у вас есть страница продукта, которая вызывается с помощью URL-адреса, такого как:

product.aspx?ID=123

И в вашем коде у вас есть такой запрос:

string sql = "SELECT * FROM Products WHERE ID = " + Request.Querystring["ID"];

Кто-то может вызвать вашу страницу с этим URL:

product.aspx?ID=123;DROP Table Students;

И бац, ты только что был.

В дополнение ко всему, что может быть передано через пользователя, строку запроса, сообщение, cookie, переменную браузера и т. Д. Я думаю, что это хорошая практика - всегда использовать параметры, даже если в вашем коде есть литералы. Например:

if(SomeCondition)
{
    sql = "Select * from myTable where someCol = 'foo'";
}
else
{
    sql = "Select * from myTable where someCol = 'bar'";
}

это может быть безопасно для инъекций, но ваша СУБД будет кэшировать их как два разных запроса. если ты изменишь это на следующее:

sql = "Select * from myTable where someCol = @myParam";
if(SomeCondition)
{
   myCommand.Parameters.Add("@myParam").value = "foo";
}
else
{
   myCommand.Parameters.Add("@myParam").value = "bar";
}

Вы получаете тот же результат, но СУБД будет кэшировать его только как один запрос, подставляя параметр во время выполнения. Я использую это как практическое правило, чтобы ВСЕГДА использовать параметризованные запросы, просто для обеспечения согласованности, не говоря уже о небольшом улучшении кэша.

4 голосов
/ 11 ноября 2009

Внедрение SQL вызвано неанимированными данными. Вы всегда должны всегда очищать данные, поступающие в базу данных. Не только для внедрения SQL, но и для того, чтобы приложение просто работало.

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

3 голосов
/ 11 ноября 2009

Фрагменты SQL-инъекций также могут входить в из QueryString (он же «URL-аргументы»), передаваемой методом GET.

Как намекнул Билли О'Нил [подразумевается одиночная кавычка ;-)], любой фрагмент данных, не свойственный программе (или ее очень надежному фону), должен быть "очищен". Термин Санитарная обработка , по-видимому, подразумевает сложный процесс, но в действительности он обычно означает чуть больше, чем:
[может отличаться в зависимости от конкретной марки SQL-сервера]

  • удалить (или экранировать) символы одинарных кавычек, встроенные в строку
  • наблюдение за строками превысило длину базового столбца SQL (в частности, если такая длина очень велика)

Возможная причина того, что формы HTTP являются единственным источником фрагментов SQL-инъекций, заключается в том, что -valid- рекомендация состоит в том, чтобы гарантировать, что пользователь получает представленный текст исключительно из формы запроса. Некоторые платформы веб-приложений предоставляют HTTP-запрос как объект, который по умолчанию предоставляет все пары ключ-значение из QueryString, из формы или даже из файлов cookie, доступные как из одного хэша. Хотя это может быть практичным для приложений, которые иногда получают информацию из формы, а иногда из строки запроса, это может облегчить работу потенциальных инжекторов, поскольку проще создать URL-адрес, чем форму. (Но с помощью подходящего инструмента можно также подделать запрос POST ...)

2 голосов
/ 11 ноября 2009

Подводя итог - любой тип ввода от пользователя, который используется в запросах SQL, является потенциальной целью внедрения SQL

2 голосов
/ 11 ноября 2009

Нет, есть несколько других случаев. Например, некоторые переменные могут быть представлены в виде строки запроса на странице php. «Пользователь» может изменить эту строку, включив в нее некоторые хитрые сценарии.

http://en.wikipedia.org/wiki/SQL_injection включает большой раздел о типах уязвимостей и о том, как эффективно с ними бороться.

1 голос
/ 11 ноября 2009

Все, что код принимает в качестве входных данных из HTTP-запроса, может быть вектором внедрения SQL:

  • Содержание POST / PUT
  • GET URL параметры
  • Печенье

На более высоком уровне они отображаются как значения $ _REQUEST или Page.Request, переменная сеанса, все зависит от множества факторов. но, в конечном счете, не просто формы POST. Хотя, вероятно, самый распространенный вектор - это содержимое формы POST и переменные URL GET.

1 голос
/ 11 ноября 2009

SQL-инъекции возможны, если вы используете любые данные, поступающие из браузера. Это могут быть данные формы, данные строки запроса, значения файлов cookie или даже данные из заголовка запроса.

Очевидными и простыми способами являются данные формы и строки запроса, но все, что приходит из браузера, может быть подделано.

1 голос
/ 11 ноября 2009

Также рассмотрите возможность предотвращения против межсайтового скриптинга ("XSS") .

0 голосов
/ 11 ноября 2009

Я согласен, что параметризация - лучший подход.

В качестве альтернативы (которая может быть проще встроена в ваш код, по крайней мере, на начальном этапе), двойные одинарные кавычки в строке будут препятствовать SQL-инъекции.

Чтобы взять пример Нейла N:

sql = "Select * From Products Where ID = " + Request.Querystring["ID"]; 

Оберните переменную в функцию, которая удваивает кавычки, и оберните переменную в одинарные кавычки.

sql = "Select * From Products Where ID = " 
    + fnSQLSafeParam(Request.Querystring["ID"]);

Функция будет выглядеть примерно так (пример VBscript):

Function fnSQLSafeParam(ByVal strStr)
  If IsNull(strStr) or IsEmpty(strStr) then strStr = ""
  fnSQLSafeParam = "'" & replace(Trim(CStr(strStr)), "'", "''") & "'"
End Function
0 голосов
/ 11 ноября 2009

Как правило, всегда должны использоваться параметризованные запросы.

  1. Он предотвращает выполнение злонамеренного пользовательского ввода для вашей базы данных (атаки с использованием SQL-инъекций). [Вы должны также выполнить проверку пользовательского ввода, чтобы убедиться, что вредоносный код не отображается на странице и что JavaScript может быть запущен на вашем сервере.]
  2. Позволяет повторно использовать ваши запросы.
  3. Вы можете предварительно скомпилировать ваши запросы.
  4. Он организует ваш ввод и делает его более читабельным. Возможно, вы захотите использовать один и тот же параметр в нескольких местах.
  5. Улучшена поддержка различных типов данных, таких как даты, строки и тому подобное. Вы не столкнетесь с проблемами со странными символами, когда будете использовать параметризованные запросы.

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

...