Zabezpieczenie przed sql injection

0

Hej!
Wiem, że tematów było mnóstwo i trochę poczytałem i znalazłem info, że przed takim atakiem może zabezpieczyć używanie preapred statement np.

query.SQL.Text := 'update people set name=:Name where id=:ID';
query.Prepare;
query.ParamByName( 'Name' ).AsString := name;
query.ParamByName( 'ID' ).AsInteger := id;
query.ExecSQL;

Czy takie cos wystarczy aby uchronic przed wstrzyknieciem niechcianego kodu? Mozecie mi wyjasnic, jezeli tak, na jakiej zasadzie to dziala, ze nie spowoduje szkod w bazie?

pozdrawiam!

3

Tak, parametry zabezpieczają przed wstrzyknięciem niepożądanego kodu SQL. Zrób sobie przykład z kodem:

; DROP TABLE people

bez parametru kod się wykona. Jeżeli wsadzimy to w parametr name to w kolumnie name doda się to co wpisaliśmy + '; DROP TABLE people'.

0

Czyli zostanie potraktowane to jako "zwykly string" do umieszczenia w bazie i SQL zignoruje wszystko co tam jest wpisane i nie wykona tego. Dobrze rozumiem?

Nawet jezeli pomyslimy o zabawie z komentarzami itp.?

; DROP TABLE people /*
2

Tak. Problem z SQL injection leży w tym, że zapytanie budowane było ze stringa budowanego na podstawie danych wejściowych.
Użycie "preapred statement" powoduje, że zapytanie jest tworzone ze stringa, nad którego kształtem użytkownik nie ma jakiegokolwiek kontroli.
Dane użytkownika stają sie parametrem zapytania, a nie jego częścią.

1 użytkowników online, w tym zalogowanych: 0, gości: 1