• 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%?

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
859 wizyt
pytanie zadane 19 sierpnia 2022 w SQL, bazy danych przez kubekszklany Gaduła (3,250 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 Mentor (350,400 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,250 p.)
Akurat potrzebował bym rozwiązania w zapytaniu, bo nie pisze bezpośrednio w php.
komentarz 19 sierpnia 2022 przez adrian17 Mentor (350,400 p.)
(a w czym?)
komentarz 19 sierpnia 2022 przez kubekszklany Gaduła (3,250 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 Mentor (350,400 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 (36,800 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 (83,530 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,250 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 (83,530 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 489 wizyt
pytanie zadane 25 lipca 2015 w PHP przez Exec Użytkownik (510 p.)
0 głosów
0 odpowiedzi 264 wizyt
pytanie zadane 22 stycznia 2023 w Bezpieczeństwo, hacking przez niezalogowany
0 głosów
1 odpowiedź 742 wizyt
pytanie zadane 17 lutego 2021 w Algorytmy przez CSSoup Mądrala (6,460 p.)

93,159 zapytań

142,171 odpowiedzi

321,892 komentarzy

62,489 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 453p. - Marcin Putra
  2. 453p. - dia-Chann
  3. 447p. - Łukasz Piwowar
  4. 443p. - CC PL
  5. 431p. - Łukasz Eckert
  6. 428p. - rafalszastok
  7. 423p. - Michal Drewniak
  8. 423p. - Adrian Wieprzkowicz
  9. 418p. - rucin93
  10. 410p. - Piotr Aleksandrowicz
  11. 408p. - ksalekk
  12. 402p. - Mariusz Fornal
  13. 401p. - Dawid128
  14. 383p. - Hubert Chęciński
  15. 340p. - ssynowiec
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...