sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-injektioner med ersätter enstaka citat och validerar heltal

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.




  1. Felaktig nyckelfil med MySQL

  2. to_sql + sqlalchemy + kopiera från + postgresql-motor?

  3. Anropa en medlemsfunktion find() på ett icke-objekt när data infogas med PHP mySQL simpleHTMLDOM

  4. Hur man anropar en funktion med parametern Rowtype från en select-sats i Oracle