Sprawdzanie wtrysku SQL

Próbuję tutaj po prostu udowodnić, że ta prosta funkcja nie jest wystarczająco dobra, aby zapobiec każdemu incydentowi sql na świecie:

Function CleanForSQL(ByVal input As String) As String
    Return input.Replace("'", "''")
End Function

Oto typowa instrukcja z jednej z naszych aplikacji:

Database.DBUpdate("UPDATE tblFilledForms SET Text1 = '" + CleanForSQL(txtNote.Text) + "' WHERE FilledFormID = " + DGVNotes.SelectedRows(0).Cells("FilledFormID").Value.ToString)

Wiem, że nie jest bezpieczny, z powodu googlingu i wyszukiwania innych pytań na StackOverflow.com.Tutaj to jedno pytanie, które znalazłem, w którym wszystkie funkcje, takie jak ta, którą przedstawiłem powyżej, są nieistotne i bezcelowe.

Tak więc na podstawie posta, z którym nawiązałem połączenie, po prostu wpisując

„Chr (8); update tblMaint SET Value1 = 2 WHERE ValueID = 2--

w txtNote powinno wystarczyć, aby wyczyścić każdą wartość w text1 w całej tabeli tblFilledForms, a następnie zaktualizować drugi wiersz tabeli tblmaint, aby był poprawny 2?

To, co powinno się tutaj wydarzyć, polega na tym, że VB zinterpretuje to jako

UPDATE tblFilledForms SET Text1 = '' 'Chr (8); update tblMaint SET Value1 = 2 WHERE ValueID = 2-- 'WHERE FilledFormID = 5120327

i wyślij go do SQL, który wykona wykonanie Chr (8) w celu wymazania trzeciego ”, co mogłoby spowodować

UPDATE tblFilledForms SET Text1 = ''; update tblMaint SET Value1 = 2 WHERE ValueID = 2-- 'WHERE FilledFormID = 5120327

być właściwie wykonanym w bazie danych?

Następnie skopiowałem Chr (8) ze schowka i zastąpiłem Chr (8) w polu tekstowym zawartością schowka i nadal nie mogę. Umieszcza cały łańcuch bezpośrednio w polu bez problemów.

Więc co tu robię źle? lub co jeszcze mogę zrobić, aby to złamać?

Technologie i pochodzenie: Używam MS SQL Server 2005 i VB .NET 2005. Pole Text1 w bazie danych jest polem Varchar (600) (nie pytaj, dlaczego nie jest MAX, to bezcelowe, wiem) Tam są pewne wyzwalacze w tabeli, które uniemożliwiłyby masową aktualizację, taką jak ta, i rzucały pewne błędy, jeśli zastrzyk działał prawidłowo.

PS. Wiem, że sparametryzowane kwerendy są sposobem na to, aby się tu udać i nie szukam odpowiedzi typu „no nie wiem, dlaczego to nie działa, ale sparametryzowane zapytania są dobrym rozwiązaniem”. Szukam możliwości udowodnienia, że ​​nasze oprogramowanie jest zepsute i że musimy go przepisać przy użyciu lepszych zasad.

Dla każdego, kto czyta to pytanie, aby dowiedzieć się, jak lepiej filtrować pola tekstowe, odpowiedź brzmi: NIE! Użyj parametrów! są znacznie lepsze, bezpieczniejsze i łatwiejsze!

questionAnswers(5)

yourAnswerToTheQuestion