Tak, pojedynczy cudzysłów jest jedyną ucieczką, więc jesteś głównie, ale nie do końca w porządku.
Korzystanie z parametrów, podczas gdy najlepsze, polega głównie na wymianie '
na ''
, którą robisz ręcznie. ALE, również wymuszają maksymalną długość ciągu. Oczywiście, gdybyśmy mówili o parametrach innych niż łańcuchowe, mogliby wymusić na nich typ danych (tj. '
nie musi być zmieniony w przypadku danych liczbowych, daty/czasu itp., Ponieważ nie jest on prawidłowy dla na początek).
Problem, który można nadal pozostawić, stanowi podzbiór SQL Injection o nazwie SQL Truncation. Chodzi o to, aby zmusić część dynamicznego sql z końca łańcucha. Nie jestem pewien, jak prawdopodobne jest to w praktyce, ale w zależności od tego, jak i gdzie konstruujesz dynamiczny sql, musisz upewnić się, że zmienna przechowująca dynamiczny SQL do wykonania jest wystarczająco duża, aby pomieścić statyczne elementy w Twój kod plus wszystkie zmienne, zakładając, że są złożone w maksymalnej długości.
Oto artykuł z MSDN Magazine, New SQL Truncation Attacks And How To Avoid Them, który pokazuje zarówno zwykłe SQL Injection, jak i skracanie SQL. W artykule zobaczysz, że w celu uniknięcia SQL Injection najczęściej używają one metody REPLACE(@variable, '''', '''''')
, ale w niektórych sytuacjach również są wyświetlane przy użyciu QUOTENAME(@variable, '[')
.
EDIT (20.01.2015): Tutaj jest dobrym źródłem informacji, choć nie jest specyficzny dla SQL Server, który zawiera szczegółowy opis różnych typów SQL Injection: https://www.owasp.org/index.php/Testing_for_SQL_Injection_(OTG-INPVAL-005)
Poniższy artykuł jest związany z jednym powyżej . Ten jest specyficzny dla SQL Server, ale bardziej ogólny pod względem ogólnego bezpieczeństwa. Istnieją sekcje związane z SQL Injection:
https://www.owasp.org/index.php/Testing_for_SQL_Server
Można zastąpić znak pojedynczego cudzysłowu szesnastkową reprezentacją lub jego reprezentacją w Unicode lub można faktycznie oszukać "sanację", spodziewając się tego zachowania i używając odpowiedniej liczby pojedyncze cytaty, więc twoje "warunki sanitarne" całkowicie zawodzą ... ** poważnie **: nie rób tego. *** NIGDY WIECZNIE *** - używaj parmaeterów - *** ZAWSZE *** –
@marc_s Proszę napisać instrukcję wstawiania wstawiającą 1000 linii z 50 polami. Jeśli możesz to zrobić (wskazówka: nie możesz), wtedy nazywam to dobrym komentarzem. W przeciwnym razie: ignorant. Liczba parametrów jest ograniczona i czasami istnieją dobre przypadki użycia innej metody. – TomTom
Jeśli robisz to TomTom używaj SQLBulkCopy - marc_s ma rację, przynajmniej pod względem używania parametrów – Swomble