Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 16201|Відповідь: 0

[ASP.NET] ASP.NET анти-SQL ін'єкції

[Копіювати посилання]
Опубліковано 17.04.2015 13:06:50 | | |

1. Що таке SQL-ін'єкція?
     Так звана SQL-ін'єкція полягає у вставці SQL-команд у форму для подачі або введення рядка запиту доменного імені або запиту сторінки, а потім обманом сервера, змушуючи його виконувати шкідливі SQL-команди. Вводячи параметри для створення розумних SQL-операторів, ви можете успішно отримати потрібні дані.

2. SQL тип ін'єкції
Зокрема, SQL-ін'єкцію можна поділити на п'ять категорій: ін'єкція чисел, ін'єкція символів, ін'єкція пошуку (like), ін'єкція та ін'єкція зв'язку речення.
З точки зору застосування, особливу увагу слід приділяти SQL-ін'єкції в IP, пошуку, пакетному видаленню та передачі з бази даних в базу.

3. Як вводити ін'єкції

Давайте розглянемо типовий приклад
SqlCommand cmd = новий SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '"
2+ Ім'я користувача + "' І UserPassword = '" + PassWord + "'", conn);

Оскільки немає перевірки для UserName та PassWord, якщо UserName="admin' АБО 1=1--"
Виконаний SQL-оператор виглядає:

ВИБРАТИ * З PE_USERS ДЕ Ім'я користувача='адмін' АБО 1=1—' І UserPassword=''

Це призводить до SQL-ін'єкції, і умови завжди відповідні, тож ви можете успішно увійти без пароля.



4. Як запобігти ін'єкції SQL

1. Фільтруйте або конвертуйте підозрілі рядки

      Ін'єкції SQL запобігають написанням функцій, які фільтрують або конвертують небезпечні рядки, а потім використовують GLOBAL.ASAX або переписують екземпляри контексту

     Ось приклад

публічний статичний bool SqlFilter2 (рядок InText)
2  {
3-рядковий word="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

захищена порожнеча 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 (струна 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 Server наступний SQL-оператор:

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 уникає введення даних.

  1. public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Копія коду


DbTye або SqlDbType можуть бути різними типами даних.
Ви можете обирати за типом даних.
У деяких місцях його також можна використовувати для задання довжини параметра: int size. Це також ефективно запобігає переповненням бази даних і SQL-нотатками
Можливість участі.
Переваги: Ефективно запобігає ін'єкціям SQL.
Недоліки: Деякі місця не можуть бути застосовані, наприклад, в.

3. Білий список

Опис:
Деякі відомі діапазони параметрів можна обробляти у вигляді білих списків, що запобігає внесенню SQL-ін'єкцій і запитів
Неправильно, наприклад: порядок за + назвою стовпця, коли назва стовпця передається у вигляді параметра, можна сформулювати білий список, щоб спочатку оцінити параметр
Чи є номер у білому списку, а потім зробіть запит, інакше він буде оброблений неправильно.
Переваги: безпечно та надійно
Недоліки: Обмежений спектр застосувань




Попередній:Текстове поле дозволяє вводити лише номери
Наступний:asp.net Текстовий редактор (FCKeditor)
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com