W odpowiedzi na Twoje bezpośrednie pytanie:Czy ten kod zapobiega wstrzykiwaniu SQL:Nie
Oto dowód — przeprowadź ten ciąg przez metodę PrepareString:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
Zmodyfikowałem opublikowaną przez Ciebie metodę GetRecord, aby zwracała w pełni przygotowany ciąg SQL zamiast pobierać rekord z bazy danych:
Console.WriteLine(GetRecord(output))
A to jest wynik
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Dodaj 1 dodatkową linię kodu:
My.Computer.Clipboard.SetText(input)
Masz ciąg znaków, który musisz skopiować bezpośrednio do schowka, aby wkleić go do pola wejściowego na stronie internetowej, aby zakończyć wstrzykiwanie SQL:
'; Drop Table TableName; - -
[Zauważ, że znaki kontrolne zostały pominięte w wynikach postu przez StackOverflow, więc będziesz musiał postępować zgodnie z przykładem kodu, aby utworzyć wyjście]
Po uruchomieniu metody PrepareString będzie ona miała dokładnie takie same dane wyjściowe — kod Chr(8) ASCII to backspace, który usunie dodatkowe „'”, które dołączasz do mojego, co spowoduje zamknięcie ciągu, a następnie swobodnie dodawać na końcu co chcę. Twój PrepareString nie widzi mojego -- ponieważ faktycznie używam -- ze znakiem cofania, aby usunąć spację.
Wynikowy kod SQL, który budujesz, wykona następnie moją instrukcję Drop Table bez przeszkód i natychmiast zignoruje resztę zapytania.
Zabawną rzeczą w tym jest to, że możesz użyć niedrukowalnych znaków, aby w zasadzie ominąć każdą kontrolę znaków, którą możesz wymyślić. Najbezpieczniej jest więc używać sparametryzowanych zapytań (nie o to prosiłeś, ale jest to najlepsza droga, aby tego uniknąć).