Zdaję sobie sprawę, że sparametryzowane zapytania SQL są optymalnym sposobem oczyszczenia danych wejściowych użytkownika podczas tworzenia zapytań zawierających dane wejściowe użytkownika, ale zastanawiam się, co jest złego w przyjmowaniu danych wejściowych użytkownika i unikaniu pojedynczych cudzysłowów i otaczaniu całego ciągu pojedynczymi cudzysłowami. Oto kod:
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
Wszelkie pojedyncze cudzysłowy, które wprowadzi użytkownik, są zastępowane podwójnymi pojedynczymi cudzysłowami, co eliminuje możliwość zakończenia ciągu przez użytkownika, więc wszystko inne, co mogą wpisać, takie jak średniki, znaki procentu itp., Będzie częścią ciągu i faktycznie nie wykonywane jako część polecenia.
Używamy Microsoft SQL Server 2000, w przypadku którego uważam, że pojedynczy cudzysłów jest jedynym ogranicznikiem ciągu i jedynym sposobem na uniknięcie tego separatora, więc nie ma możliwości wykonania czegokolwiek wpisanego przez użytkownika.
Nie widzę żadnego sposobu na przeprowadzenie ataku SQL injection przeciwko temu, ale zdaję sobie sprawę, że gdyby było to tak kuloodporne, jak mi się wydaje, ktoś inny by już o tym pomyślał i byłoby to powszechną praktyką.
Co jest nie tak z tym kodem? Czy istnieje sposób, aby atak polegający na wstrzyknięciu kodu SQL przeszedł przez tę technikę oczyszczania? Przykładowe dane wejściowe użytkownika wykorzystujące tę technikę byłyby bardzo pomocne.
AKTUALIZACJA:
Nadal nie znam żadnego sposobu na skuteczne przeprowadzenie ataku SQL injection na ten kod. Kilka osób zasugerowało, że ukośnik odwrotny pomija jeden pojedynczy cudzysłów, a drugi kończy ciąg, tak aby reszta ciągu została wykonana jako część polecenia SQL, i zdaję sobie sprawę, że ta metoda zadziała, aby wstrzyknąć SQL do baza danych MySQL, ale w SQL Server 2000 jedynym sposobem (jaki udało mi się znaleźć) na uniknięcie pojedynczego cudzysłowu jest użycie innego pojedynczego cudzysłowu; ukośniki odwrotne tego nie zrobią.
I chyba że istnieje sposób na zatrzymanie zmiany znaczenia pojedynczego cudzysłowu, żadna z pozostałych danych wejściowych użytkownika nie zostanie wykonana, ponieważ całość zostanie potraktowana jako jeden ciągły ciąg.
Rozumiem, że istnieją lepsze sposoby odkażania danych wejściowych, ale naprawdę jestem bardziej zainteresowany dowiedzeniem się, dlaczego metoda, którą podałem powyżej, nie działa. Jeśli ktoś zna jakiś konkretny sposób przeprowadzenia ataku typu SQL injection przeciwko tej metodzie dezynfekcji, bardzo chciałbym to zobaczyć.