Mamy tutaj inną dyskusję na temat używania sparametryzowanych zapytań sql w naszym kodzie. Mamy dwie strony dyskusji: ja i kilku innych, którzy twierdzą, że powinniśmy zawsze używać parametrów do ochrony przed wstrzyknięciami sql i innymi facetami, którzy nie uważają, że jest to konieczne. Zamiast tego chcą zastąpić pojedyncze apostrofy dwoma apostrofami we wszystkich ciągach, aby uniknąć iniekcji sql. Wszystkie nasze bazy danych działają pod kontrolą Sql Server 2005 lub 2008, a nasz kod bazowy działa na platformie .NET Framework 2.0.
Podam prosty przykład w C #:
Chcę, żebyśmy to wykorzystali:
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
Podczas gdy inni chcą to zrobić:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
Gdzie funkcja SafeDBString jest zdefiniowana w następujący sposób:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
Tak długo, jak używamy SafeDBString na wszystkich wartościach ciągów w naszych zapytaniach, powinniśmy być bezpieczni. Dobrze?
Istnieją dwa powody, dla których warto używać funkcji SafeDBString. Po pierwsze, jest to sposób, w jaki robiono to od wieków kamienia, a po drugie, łatwiej jest debugować instrukcje sql, ponieważ widzisz zapytanie excact, które jest uruchamiane w bazie danych.
A więc wtedy. Moje pytanie brzmi, czy naprawdę wystarczy użyć funkcji SafeDBString, aby uniknąć ataków sql injection. Próbowałem znaleźć przykłady kodu, który łamie ten środek bezpieczeństwa, ale nie mogę znaleźć żadnych przykładów.
Czy jest ktoś, kto może to zepsuć? Jak byś to zrobił?
EDYCJA: podsumowanie dotychczasowych odpowiedzi:
- Nikt nie znalazł jeszcze sposobu na obejście SafeDBString na Sql Server 2005 lub 2008. Myślę, że to dobrze?
- W kilku odpowiedziach wskazano, że podczas korzystania z zapytań parametrycznych uzyskuje się wzrost wydajności. Powodem jest to, że plany kwerend można ponownie wykorzystać.
- Zgadzamy się również, że używanie sparametryzowanych zapytań daje bardziej czytelny kod, który jest łatwiejszy w utrzymaniu
- Ponadto łatwiej jest zawsze używać parametrów niż używać różnych wersji SafeDBString, konwersji ciągów na liczby i konwersji ciągów na datę.
- Używając parametrów, uzyskujesz automatyczną konwersję typów, co jest szczególnie przydatne, gdy pracujemy z datami lub liczbami dziesiętnymi.
- I na koniec: nie próbuj zabezpieczać się, jak napisał JulianR. Dostawcy baz danych poświęcają dużo czasu i pieniędzy na bezpieczeństwo. Nie ma sposobu, abyśmy mogli zrobić to lepiej i nie ma powodu, dla którego powinniśmy próbować wykonywać ich pracę.
Więc chociaż nikt nie był w stanie złamać prostego zabezpieczenia funkcji SafeDBString, otrzymałem wiele innych dobrych argumentów. Dzięki!