• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SQL Injection - czy tym sposobem zabezpieczę się w 100%?

Object Storage Arubacloud
0 głosów
478 wizyt
pytanie zadane 19 sierpnia 2022 w SQL, bazy danych przez kubekszklany Gaduła (3,190 p.)

Witam. Potrzebuję się dowiedzieć czy poniższa metoda uchroni mnie w 100% przed sql injection, czy raczej nie. Ogólnie sql injection można wykonać wychodząc z cudzysłowu znakiem ', Czyli np. przy zapytaniu SELECT x WHERE y = 'z', użytkownik zamiast z wpisze z' OR 'z' = 'z i będzie SELECT x WHERE y = 'z' OR 'z' = 'z'. Z tego co wiem, można pojedynczy znak cudzysłowy zastąpić podwójnym, wtedy będzie SELECT x WHERE y = 'z'' OR ''z'' = ''z' i atak będzie nieskuteczny. Pytanie natomiast brzmi, czy w ten sposób uchronię się przed wszystkimi atakami typu SQL Injection, czy są jeszcze jakieś inne znaki na które muszę uważać? Bo jeśli to wystarczy to znaczy że wystarczy dla każdego string'a wprowadzanego przez użytkownika wykonać operację zamiany ' na '' i sql injection będzie niemożliwe?

2 odpowiedzi

+5 głosów
odpowiedź 19 sierpnia 2022 przez adrian17 Ekspert (344,860 p.)

Nie kombinuj. Po prostu zamiast sklejać ręcznie stringi, użyj prepared statements i osobne przekazywanie/bindowanie argumentów.

To jest standardowy sposób pisania zapytań od co najmniej kilkunastu lat, więc proszę nie wynajduj koła na nowo :(

Przykład z PDO:

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status=:status');
$stmt->execute(['email' => $email, 'status' => $status]);

 

komentarz 19 sierpnia 2022 przez kubekszklany Gaduła (3,190 p.)
Akurat potrzebował bym rozwiązania w zapytaniu, bo nie pisze bezpośrednio w php.
komentarz 19 sierpnia 2022 przez adrian17 Ekspert (344,860 p.)
(a w czym?)
komentarz 19 sierpnia 2022 przez kubekszklany Gaduła (3,190 p.)
Obecnie C#, ale fajnie by było rozwiązanie uniwersalne jakieś znać. Jeśli to co napisałem to prawda to będzie działać w każdym języku, pytanie tylko czy mam rację czy nie.
komentarz 19 sierpnia 2022 przez adrian17 Ekspert (344,860 p.)

Obecnie C#

(w tagach pytania wpisałeś php, stąd założyłem php)

ale fajnie by było rozwiązanie uniwersalne jakieś znać

Uniwersalnym rozwiązaniem jest... prepared statement. Poważnie. Składnia jest różna, ale podejście jest takie samo w każdym języku od lat - przekazujesz stringa SQLowego z placeholderami i osobno "argumenty".

Przykład z dokumentacji MySQLa:

https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-parameters.html

string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent=@Continent";
MySqlCommand cmd = new MySqlCommand(sql, conn);

cmd.Parameters.AddWithValue("@Continent", user_input);

Albo na przykład w Pythonie:

c.execute('SELECT * FROM users WHERE email = ? AND status = ?', (email, status))
 

 

komentarz 19 sierpnia 2022 przez jankustosz1 Nałogowiec (35,880 p.)

@kubekszklany, lepiej nigdy samemu tego nie escapuj, bo możesz pominąć jakiś przypadek. Albo np. hakerzy wymyślą jakiś nowy sposób i tego nie uwzględnisz. Takie funkcje z gotowych bibliotek są na 100% bezpieczne i na bieżąco w razie czego uaktualniane. 

Co do C# to masz kilka możliwości. To co podał adrian17 jest dosyć niskopoziomowe, możesz też użyć Entity Framework albo np. Dappera jeżeli chcesz samemu pisać zapytanie

0 głosów
odpowiedź 19 sierpnia 2022 przez marcin99b Szeryf (82,180 p.)
teoretycznie mógłbyś pozmieniać ' na \' i " na \" w stringach z których budujesz zapytanie i wydaje mi sie że powinno zadziałać

ale to tylko teoretycznie, lepiej nie ryzykować jak się dobrze nie ogarnia tematu i zaufać gotowym rozwiązaniom, często jest tak że coś co z zewnątrz wydaje sie bardzo proste, pod spodem jest tak na prawde skomplikowane

może jest jakiś sposób żeby to obejść (w sumie jak ktoś zna to chętnie sie dowiem)
komentarz 19 sierpnia 2022 przez kubekszklany Gaduła (3,190 p.)
Masz na myśli tzw. escape character? To właśnie wyjście z ' (pojedynczego cudzysłowa) to zamiana na '' (podwójny cudzysłów) z tego co wiem.
komentarz 20 sierpnia 2022 przez marcin99b Szeryf (82,180 p.)

tak

To właśnie wyjście z ' (pojedynczego cudzysłowa) to zamiana na '' (podwójny cudzysłów) z tego co wiem

to źle wiesz, to zamiana znaku specjalnego który może być interpretowany w specjalny sposób, na dosłownie ten znak (żeby był traktowany jak każdy inny znak)

normalnie apostrofy i cudzysłowy są traktowane jako koniec stringa w sql, więc ktoś może go zakończyć przedwcześnie, a po tym dopisać własną część do zapytania - na tym polega sql injection 

jeśli taki znak nie będzie widoczny jako "ten specjalny znak", tylko "tak jak każdy inny", to powinien być zignorowany

 

ale pewnie na obejście tego też są sposoby, najlepiej byłoby poczytać kod jakiejś biblioteki chroniącej przed sql injection i sprawdzić jak oni to robią 

Podobne pytania

+1 głos
3 odpowiedzi 383 wizyt
pytanie zadane 25 lipca 2015 w PHP przez Exec Użytkownik (510 p.)
0 głosów
0 odpowiedzi 210 wizyt
pytanie zadane 22 stycznia 2023 w Bezpieczeństwo, hacking przez niezalogowany
0 głosów
1 odpowiedź 454 wizyt
pytanie zadane 17 lutego 2021 w Algorytmy przez CSSoup Mądrala (6,460 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...