Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak działa wstrzykiwanie SQL i jak się przed nim chronić?

Wstrzyknięcie SQL to złośliwie utworzone zapytanie SQL używane do „zmylenia” bazy danych SQL w celu uzyskania czegoś, czego nie powinno. Rozważmy na przykład następujące zapytanie

"SELECT * FROM `users` WHERE `username` = '$name'";

W normalnym przypadku to zadziała. Jeśli dodamy do tego 'Jack', zwróci to wszystkich użytkowników o imieniu Jack. Jeśli jednak użytkownik wprowadzi, powiedz „' LUB 1=1”, wynikowe zapytanie będzie

"SELECT * FROM `users` WHERE `username` = '' OR 1=1";

Ponieważ 1 zawsze równa się 1, a klauzula łącząca to OR, zwróci to prawda w każdym wierszu, co z kolei wyświetli złośliwemu użytkownikowi KAŻDY wiersz. Korzystając z tej techniki, ktoś może wyświetlić całą Twoją bazę danych. Zastanów się również, czy ktoś prześle coś takiego jak „'; DROP TABLE users ";--, co skutkuje

"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";

Czyli dwa zapytania, jedno, które nic nie da, drugie, które usunie CAŁĄ bazę danych użytkowników, co spowoduje utratę danych.

Najlepszą metodą zapobiegania wstrzykiwaniu SQL jest użycie przygotowanych instrukcji. Za ich pomocą wysyłasz zapytanie do bazy danych SQL, które mówi coś w stylu

"SELECT * FROM `users` WHERE `username` = '?'";

Dzięki temu baza danych pozna format zapytania (WHERE nazwa użytkownika jest równa pewnej wartości), więc nie ma pomyłek w przypadku zapytania w postaci zwykłego tekstu. Wtedy baza danych wie, jak oczekiwać jednej wartości i gdzie ją umieścić. Następnie przekazujesz tę wartość do bazy danych, której może użyć do wyszukiwania. Jest to również lepsze, ponieważ baza danych może zoptymalizować zapytanie w celu szybszego wyszukiwania.

Przeczytaj przygotowane oświadczenia, które wyjaśnią to bardziej szczegółowo.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. WYBIERZ i wypisz dzieci i rodziców

  2. org.hibernate.InstantiationException:Brak domyślnego konstruktora dla encji::principal.Cliente

  3. Błąd krytyczny PHP:Niezłapany wyjątek PDO:nie można znaleźć sterownika

  4. zaktualizuj kolumnę tabeli po wstawieniu nowego rekordu za pomocą wyzwalaczy MySQL

  5. Koder Python JSON do obsługi daty i godziny?