1. Czym jest SQL injection? Tak zwana SQL injection polega na wstawieniu poleceń SQL do formularza formularza, aby przesłać lub wprowadzić ciąg zapytania o nazwę domeny lub żądanie strony, a na końcu oszukać serwer do wykonania złośliwych poleceń SQL. Przesyłając parametry do tworzenia sprytnych instrukcji SQL, można skutecznie uzyskać pożądane dane.
2. SQL rodzaj zastrzyku Konkretnie, SQL injection można podzielić na pięć kategorii: wstrzyknięcie liczb, wstrzykiwanie znaków, wstrzykiwanie wyszukiwania (like), incoming oraz wstrzykiwanie połączeń zdań. Z punktu widzenia aplikacji należy zwrócić szczególną uwagę na wstrzykiwanie SQL w IP, wyszukiwanie, usuwanie wsadowe oraz transfer z bazy do bazy.
3. Jak wprowadzać zastrzyki
Przyjrzyjmy się typowemu przykładowi
SqlCommand cmd = nowy SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' AND UserPassword = '" + Hasło + "'", conn); Ponieważ nie ma weryfikacji dla UserName i Hasła, jeśli UserName="admin' LUB 1=1--" Wykonywane polecenie SQL przyjmuje następujący post:
WYBIERZ * Z PE_USERS GDZIE UserName='admin' LUB 1=1—' I UserPassword='' To skutkuje wstrzykiwaniem SQL, a warunki są zawsze spełnione, więc możesz się pomyślnie zalogować bez hasła.
4. Jak zapobiec SQL injection
1. Filtruj lub konwertuj podejrzane ciągi
Iniekcja SQL jest zapobiegana przez zapisanie funkcji, które filtrują lub konwertują niebezpieczne ciągi znaków, a następnie używają GLOBAL.ASAX lub przepisują instancje kontekstowe
Oto przykład
public static bool SqlFilter2(string InText) 2 { 3 string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 return false; 6 Foreach(string I w Word. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 wraca prawdziwie; 11 } 12 } 13 zwróciło się fałszywie; 14 }
2. Global.asax
chroniony void Application_BeginRequest(Nadawca obiektu, EventArgs e) 2 { 3 // Przechodzenie przez parametry Posta, z wyjątkiem domen ukrytych 4 Foreach (struna I w tym. Prośba.Formularz) 5 { 6 jeśli(i=="__VIEWSTATE")kontynuacja; 7 to.goErr (to. Request.Form.ToString()); 8 } 9 // Przejdź parametr Get. 10 foreach(struna I w tym. Request.QueryString) 11 { 12 to.gErr(to. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 if(WLCW. Extend.CValidity.SqlFilter2(tm)) 4 to. Response.end() 5 } Zalety: Ten aspekt jest stosowany przez większość początkujących programistów, aby zapobiec wstrzykiwaniu SQL, i wydaje się dobrze działać w większości przypadków.
Wady: 1. Filtruje znaki, które pierwotnie nie były używane do wstrzykiwania, co powoduje nieoczekiwane problemy. Na przykład, jeśli nazwa członka forum zawiera te same znaki co przefiltrowane postacie, spowoduje to nieoczekiwane problemy i kłopoty.
2. Filtrowanie lub konwersja jest wymagana za każdym razem, co obniża efektywność programu
2. Używanie procedur przechowywanych do zapytań parametrycznych
Głównym celem SQL injection jest wykonywanie złośliwych poleceń w bazie danych poprzez przesłanie złośliwego kodu SQL. Dlatego dopóki polecenia SQL są przetwarzane przed wykonaniem, wstrzykiwanie SQL może być skutecznie zapobiegane. Zapytania parametryzowane mogą skutecznie zapobiegać wstrzykiwaniu SQL.
Przykład
ciąg const strSql = "SELECT * FROM [PE_Users] GDZIE UserName = @UserName"; Parametry parms = nowe Parametry("@UserName", DbType.String, userName); Powyżej @UserName jest parametr, wykorzystujący obiekt Prarmeter, przez który parametr jest dodawany do obiektu Command, Daje to parametryzowane zapytanie. Jak opisano powyżej, ADO.NET wysyła następującą instrukcję SQL do SQL Server:
Egz sp_executesql N 'wybierz * z [pe_users], gdzie nazwa użytkownika =@username ',N '@username nvarchar(20) ',@username=N 'imię' SQL Server zastępuje @username ciągiem znaków "nazwa" przed wykonaniem zapytania. Załóżmy, że masz następujące dane wejściowe:
'Union select @@version,null,null— Wygenerowane wyrażenie SQL wygląda tak:
Egz sp_executesql N 'wybierz * z [pe_users], gdzie nazwa użytkownika =@username ',N '@username nvarchar(20) ',@username=N ''' union select @@version,null,null--' Widać, że ADO.NET unika wejściu.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Skopiuj kod
DbTye lub SqlDbType mogą obejmować różne typy danych. Możesz wybrać na podstawie typu danych. W niektórych miejscach można go również użyć do określenia długości parametru: rozmiaru int. To również skutecznie zapobiega przepełnieniom bazy danych i notatem SQL Możliwość wejścia. Zalety: Skutecznie zapobiega wstrzykiwaniu SQL. Wady: Niektórych miejsc nie da się zastosować, na przykład w.
3. Biała lista
Opis: Niektóre znane zakresy parametrów można obsługiwać w formie białych list, co uniemożliwia zastrzykiwanie SQL i zapytania Błąd, na przykład: uporządkowanie według nazwy kolumny + – gdy nazwa kolumny jest przekazywana w postaci parametru, można sformułować białą listę, aby najpierw ocenić parametr czy numer znajduje się na białej liście, a następnie zapytaj, w przeciwnym razie zostanie przetworzony nieprawidłowo. Zalety: bezpieczeństwo i niezawodność Wady: Ograniczony zakres zastosowań |