Om detta är ett äldre projekt som är kodat på det här sättet så, även om det inte är optimalt, är jag för närvarande inte medveten om något sätt att det kan vara mottagligt för SQL-injektion så länge som varje sträng behandlas på det sättet och frågorna bara är enkla sådana som du har visat.
Jag kan dock inte säga mer säkerhet än så. Utan att använda parametriserade frågor finns det alltid möjligheten att det finns någon sårbarhet som du ännu inte har beaktat.
Att manuellt undkomma offerten själv är felbenägen och kan ibland misslyckas på sätt som är svåra att förutse i förväg. Till exempel med följande tabell
CREATE TABLE myTable(title VARCHAR(100))
INSERT INTO myTable VALUES('Foo')
Och lagrad procedur med dynamisk SQL byggd upp med strängsammansättning
CREATE PROC UpdateMyTable
@newtitle NVARCHAR(100)
AS
/*
Double up any single quotes
*/
SET @newtitle = REPLACE(@newtitle, '''','''''')
DECLARE @UpdateStatement VARCHAR(MAX)
SET @UpdateStatement = 'UPDATE myTable SET title=''' + @newtitle + ''''
EXEC(@UpdateStatement)
Du kan prova följande
Normal uppdatering
EXEC UpdateMyTable N'Foo'
SELECT * FROM myTable /*Returns "Foo"*/
SQL-injektionsförsök avbröts
EXEC UpdateMyTable N''';DROP TABLE myTable--'
SELECT * FROM myTable /*Returns "';DROP TABLE myTable--"*/
SQL-injektionsförsöket lyckas och släpper tabellen
EXEC UpdateMyTable N'ʼ;DROP TABLE myTable--'
SELECT * FROM myTable /*Returns "Invalid object name 'myTable'."*/
Problemet här är att den tredje frågan passerar U+02BC istället för standardapostrof och sedan tilldelas strängen en varchar(max)
efter att sanitet inträffar som tyst omvandlar detta till en vanlig apostrof.
Tills jag läser svaret här det problemet skulle aldrig ha kommit upp för mig.