czyli jak chronić dane użytkownika przed SQL Injection

xkcd

zabawne fakty:

SQL injection istnieje praktycznie od czasu, gdy strony internetowe przechowują dane w bazach danych.

Open Web Application Security Project ocenił ataki injection jako jedno z 10 największych zagrożeń dla aplikacji internetowych w 2017 roku.,

SQL injection jest nadal odpowiedzialny za wiele dużych wycieków danych. W 2016 roku doszło do naruszenia baz danych rejestracyjnych wyborców stanu Illinois i Arizona. Podczas gdy w Arizonie nie skradziono żadnych informacji, w Illinois napastnicy mieli dostęp do danych wyborców, w tym nazwiska, adresu, daty urodzenia, płci i częściowych numerów ubezpieczenia społecznego, dla około 80 000 osób.

to przerażające, co to jest?

SQL injection to rodzaj ataku, który atakuje bazę danych aplikacji poprzez wstawianie niezamierzonego kodu do pól wejściowych użytkownika., Korzystając ze składni SQL, atakujący może użyć pól wprowadzania do przechwytywania informacji z tych baz danych — w tym haseł i numerów kart kredytowych. Ktoś może nawet przejąć kontrolę nad twoją bazą danych lub usunąć wszystkie przechowywane w niej informacje.

Jak to działa?

SQL Injection działa za pomocą informacji wstawionych do pola w celu manipulowania odpowiednim poleceniem SQL w celu wykonania niezamierzonej akcji.,

oto podstawowy przykład:

SELECT * FROM customers WHERE name = " + user_name + ";

w tym przykładzie powiedzmy, że zmienna user_name jest tworzona bezpośrednio z danych wejściowych użytkownika na stronie internetowej. Łańcuch ten jest wstawiany do powyższej instrukcji SQL i zwracane są wszystkie pola odnoszące się do tej nazwy użytkownika. Nic wielkiego.

ale co się stanie, jeśli ktoś wpisze Steve” lub 1=1; — jako nazwę użytkownika? następnie wygenerowany SQL będzie wyglądał następująco:

SELECT * FROM customers WHERE name = "Steve" OR 1=1;--";

ponieważ 1=1 jest zawsze prawdziwe, zwróci to wszystkie dane w tabeli. Niedobrze!,

Let’s take one more look at that comic.

xkcd

The son’s name is Robert’); DROP TABLE students; — What would that do exactly?,

cóż, możemy założyć, że jeśli tabele Little Bobby były dodawane do szkolnej bazy uczniów, polecenie SQL wyglądałoby mniej więcej tak:

INSERT INTO students (name) VALUES ('<Student Name>');

… i kiedy wstawiamy Bobby…

INSERT INTO students (name) VALUES ('Robert'); DROP TABLE students;--');

ponieważ imię Bobby zawiera argument ); wartość jest zamknięta w środku jego imienia i tekstu, który jest follows drop table students to nowe polecenie SQL, które usuwa całą tabelę. Na koniec — na końcu komentuje pozostały SQL, zasadniczo ignorując resztę oryginalnego kodu i upewniając się, że nie wystąpi żaden błąd.,

więc, co mówisz, moje dane nigdy nie będą bezpieczne?

Istnieje naprawdę wiele kroków, które możesz podjąć, aby chronić się przed tego rodzaju atakiem. Spójrzmy na kilka:

  1. dezynfekuj dane. Pierwszym krokiem jest kontrolowanie tego, co użytkownik może wprowadzić. Najlepszym sposobem na to jest ograniczenie typów danych wejściowych dozwolonych dla określonego pola., Na przykład w polu Numer telefonu można zezwolić tylko na Wprowadzanie numeryczne lub w polu e-mail zezwalać tylko na znaki, które można znaleźć w prawidłowym adresie e-mail. Oczywiście niektóre pola wymagają znaków, które mogą być użyte w ataku, więc ta metoda nie jest bezkonkurencyjna.
  2. Konfiguracja raportowania błędów. Często domyślne raportowanie błędów w systemach zarządzania bazami danych zawiera informacje o debugowaniu programistów. Może to zwrócić atakującemu pomocne informacje, takie jak nazwy tabel lub kolumn., Upewnij się, że nie pokazujesz tego typu informacji zewnętrznym użytkownikom, ponieważ może to ułatwić życie potencjalnemu atakującemu.
  3. używaj powiązanych parametrów. Parametry Bound pozwalają przechowywać dane użytkownika w zmiennej, a następnie wstawiać je do instrukcji SQL, która została utworzona za pomocą elementów zastępczych. Ponieważ polecenie SQL i zmienna są wysyłane do serwera oddzielnie, parametry związane są dobre w ochronie przed wtryskiem. Weź tego małego Bobby ' ego t!, Przykład powiązanych parametrów w metodzie aktualizacji w Rubim będzie wyglądał następująco:
def update sql = <<-SQL UPDATE students SET name = ?, grade = ? WHERE id = ? SQL DB.execute(sql, )end

szalenie jest myśleć, że coś tak proste i dobrze zrozumiane jest nadal odpowiedzialne za tak wiele dużych naruszeń danych., Nawet w głośnych przypadkach, takich jak wspomniane powyżej hacki rejestracyjne wyborców i niedawne naruszenie Equifax (które nie było spowodowane SQL injection, ale podobną luką, której firma nie zdołała rozwiązać), źródło luki sprowadza się do błędu ludzkiego i braku dbałości o szczegóły. Poświęcenie czasu na dokładne przemyślenie problemu może znacznie pomóc nam chronić dane użytkowników przed typowymi naruszeniami, zwłaszcza iniekcjami SQL.