sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan sammenkædes variabler i SQL-strenge

Du kan opnå dette (hvis jeg forstår, hvad du prøver at gøre) ved hjælp af dynamisk SQL.

Tricket er, at du skal oprette en streng, der indeholder SQL-sætningen. Det er fordi tabelnavnet skal angives i den faktiske SQL-tekst, når du udfører sætningen. Tabelreferencerne og kolonnereferencerne kan ikke angives som parametre, de skal fremgå af SQL-teksten.

Så du kan bruge noget som denne tilgang:

SET @stmt = 'INSERT INTO @tmpTbl1 SELECT ' + @KeyValue 
    + ' AS fld1 FROM tbl' + @KeyValue

EXEC (@stmt)

Først opretter vi en SQL-sætning som en streng. Givet en @KeyValue af 'Foo', ville det skabe en streng indeholdende:

'INSERT INTO @tmpTbl1 SELECT Foo AS fld1 FROM tblFoo'

På dette tidspunkt er det bare en snor. Men vi kan udføre indholdet af strengen som en dynamisk SQL-sætning ved at bruge EXECUTE (eller EXEC for kort).

Den gamle sp_executesql procedure er et alternativ til EXEC, en anden måde at udføre dynamisk SQL på, som også giver dig mulighed for at videregive parametre, i stedet for at angive alle værdier som bogstaver i sætningens tekst.

OPFØLGNING

EBarr påpeger (korrekt og vigtigt), at denne tilgang er modtagelig for SQL Injection.

Overvej, hvad der ville ske, hvis @KeyValue indeholdt strengen:

'1 AS foo; DROP TABLE students; -- '

Den streng, vi ville producere som en SQL-sætning, ville være:

'INSERT INTO @tmpTbl1 SELECT 1 AS foo; DROP TABLE students; -- AS fld1 ...'

Når vi UDFØRER den streng som en SQL-sætning:

INSERT INTO @tmpTbl1 SELECT 1 AS foo;
DROP TABLE students;
-- AS fld1 FROM tbl1 AS foo; DROP ...

Og det er ikke kun et DROP TABEL, der kunne sprøjtes ind. Enhver SQL kunne injiceres, og den kan være meget mere subtil og endnu mere ondskabsfuld. (De første angreb kan være forsøg på at hente information om tabeller og kolonner, efterfulgt af forsøg på at hente data (mailadresser, kontonumre osv.)

En måde at løse denne sårbarhed på er at validere indholdet af @KeyValue, sige, at det kun skal indeholde alfabetiske og numeriske tegn (f.eks. tjek for tegn, der ikke er i disse områder ved hjælp af LIKE '%[^A-Za-z0-9]%' . Hvis der findes et ulovligt tegn, så afvis værdien og afslut uden at udføre SQL.



  1. Hvordan undslipper jeg et procenttegn i T-SQL?

  2. Oracle, hvordan man åbner markøren og vælger en kolonne af mange til en variabel

  3. MySQL CHAR() vs T-SQL CHAR():Hvad er forskellen?

  4. MYSQL - Inner Join med EFTER OPDATERING i tabel