1. Что такое SQL-инъекция? Так называемая SQL-инъекция заключается в вставке SQL-команд в форму для подачи или ввода строки запроса доменного имени или страницы, а затем обмануть сервер и заставить его выполнить некоторые вредоносные SQL-команды. Вводя параметры для создания умных SQL-операторов, вы можете успешно получить нужные данные.
2. SQL тип инъекции В частности, SQL-инъекцию можно разделить на пять категорий: инъекция чисел, инъекция символов, инъекция поиска (like), инъекция в инъекции и инъекция соединения предложений. С точки зрения применения особое внимание следует уделять внедрению SQL-инъекции в IP, поиску, пакетному удалению и переносу из базы данных в базу.
3. Как делать инъекции
Рассмотрим типичный пример
SqlCommand cmd = new SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ Имя пользователя + "' И UserPassword = '" + Пароль + "'", conn); Поскольку нет проверки для имени пользователя и PassWord, если UserName="admin' ИЛИ 1=1--" Выполняемое SQL-оператор получает вид:
ВЫБРАТЬ * ИЗ PE_USERS ГДЕ UserName='admin' ИЛИ 1=1—' И UserPassword='' Это приводит к SQL-инъекции, и условия всегда выполняются, так что вы можете успешно войти без пароля.
4. Как предотвратить инъекцию SQL
1. Фильтровать или преобразовать подозрительные строки
SQL-инъекции предотвращаются за счёт написания функций, которые фильтруют или преобразуют опасные строки, а затем используют GLOBAL.ASAX или переписывают экземпляры контекста
Вот пример
публичный статический bool SqlFilter2 (строка InText) 2 { 3-строковое слово="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 возвратов ложно; 6 Foreach(строка I в слове. Сплит('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 возвратов истинно; 11 } 12 } 13 возвратов ошибочно; 14 }
2. Global.asax
Protected void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Прохождение параметров Post, за исключением скрытых доменов 4 Foreach (String I в этом). Форма запроса) 5 { 6 if(i=="__VIEWSTATE")continue; 7 this.goErr(this. Request.Form.ToString()); 8 } 9 // Пройдите параметр Get. 10 Foreach (String I в этом). Request.QueryString) 11 { 12 this.goErr(this. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 если(WLCW. Extend.CValidity.SqlFilter2(tm)) 4 этого. Response.end() 5 } Плюсы: Этот аспект используется большинством начинающих программистов для предотвращения инъекции SQL, и, похоже, он хорошо работает для предотвращения инъекций в большинстве случаев.
Недостатки: 1. Он фильтрует некоторые символы, которые изначально не использовались для инъекций, вызывая неожиданные проблемы. Например, если имя участника форума содержит те же символы, что и отфильтрованные символы, это вызовет неожиданные проблемы и проблемы.
2. Фильтрация или преобразование требуется каждый раз, что снижает эффективность программы
2. Используйте хранящиеся процедуры для параметрических запросов
Основная цель SQL-инъекции — выполнять вредоносные команды в базе данных путём подачи вредоносного SQL-кода. Таким образом, пока команды SQL обрабатываются до выполнения, инъекции SQL можно эффективно предотвратить. Параметризованные запросы эффективно предотвращают внедрение SQL.
Пример
const string strSQL = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Параметры parms = новые параметры ("@UserName", DbType.String, имя пользователя); Выше есть @UserName параметр, использующий объект Prarmeter, с помощью которого параметр добавляется в объект Command, Это даёт вам параметризованный запрос. Как описано выше, ADO.NET отправляет следующий SQL-оператор на SQL Server:
Exec sp_executesql N 'select * из [pe_users], где username=@username ',N '@username nvarchar(20) ',@username=N 'имя' SQL Server заменяет @username строкой «name» перед выполнением запроса. Предположим, у вас есть следующие входные данные:
'Союз выбрать @@version, нуль, ноль— Сгенерированный SQL-оператор выглядит так:
Exec sp_executesql N 'select * из [pe_users], где username=@username ',N '@username nvarchar(20) ',@username=N ''' объединение выбрать @@version,null,null--' Видно, что ADO.NET ускользает от ввода.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Копирование кода
DbTye или SqlDbType могут быть различными типами данных. Вы можете выбрать по типу данных. В некоторых местах его также можно использовать для указания длины параметра: int size. Это также эффективно предотвращает переполнение базы данных и SQL-заметки Возможность поступления. Плюсы: эффективно предотвращает инъекцию SQL. Недостатки: Некоторые места нельзя применять, например, в.
3. Белый список
Описание: Некоторые известные диапазоны параметров можно обрабатывать в виде белых списков, что предотвращает внедрение SQL и запросы Неправильно, например: упорядочивать по имени + столбца, когда имя столбца передаётся в виде параметра, можно сформулировать белый список, который сначала оценит параметр независимо от того, есть ли номер в белом списке, а затем выполните запрос, иначе оно будет обработано неправильно. Преимущества: безопасность и надёжность Недостатки: Ограниченный спектр применений |