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 = '" + PassWord + "'", conn); Тъй като няма валидация за UserName и 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 string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 връщане е невярно; 6 Foreach(String I в Word. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 връщат вярно; 11 } 12 } 13 отговора невярно; 14 }
2. Global.asax
защитен void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Преминаване през параметрите на Post, с изключение на скритите домейни 4 Foreach (String I в това). Заявка.Формуляр) 5 { 6 if(i=="__VIEWSTATE")продължи; 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"; Parameters parms = new Parameters("@UserName", DbType.String, userName); Има параметър @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 инжектиране и заявки Грешно, например: подредени по + име на колона, когато името на колоната се предава под формата на параметър, може да се формулира бял списък, който първо да прецени параметъра дали числото е в белия списък и след това направете заявка, в противен случай ще бъде обработено неправилно. Предимства: безопасно и надеждно Недостатъци: Малък обхват на приложения |