Avatar billede fennec Nybegynder
23. marts 2009 - 16:28 Der er 8 kommentarer

IN() data i SP fra parametre

Hej alle.

Jeg er løbet i den uheldige situation at skulle rette på en anden persons Stored Procedure, da jeg har fundet en fejl. Det drejer sig om IN() i en select, hvor alle værdierne kommer fra en parametre.

Her er et lille eks så I er med på hvad jeg mener:
SELECT * FROM MinTabel WHERE CAST(ID AS nvarchar(10)) IN(@IDList)

Denne blever så kaldt fra vores ASP kode sådan:
IDList = "1,3,5,7"
set rs = conn.execute("EXEC MySP @IDList = N'"& IDList &"'")

Det der selvfølgelig sker er at den begynder at sammenligen "1" = "1,3,5,7", Så har vi kun en værdi i vores ID liste fungere det fint, men det hændre vi har flere, også får vi ikke noget resultat, da "1" jo er forskellig fra "1,3,5,7"

Jeg er afklaret med hvorfor problemet opstår, jeg skal bare vide hvordan pokker jeg får sendt den liste ind i IN(), så det fungere som jeg forventer (og det cast() burde også være unødvendigt). Resultatet skulle gerne være at den returnere data svarende til dette kald:

SELECT * FROM MinTabel WHERE ID IN(1,3,5,7)
Avatar billede arne_v Ekspert
23. marts 2009 - 16:34 #1
konkataner en streng med SQL og EXEC den
Avatar billede arne_v Ekspert
23. marts 2009 - 16:35 #2
ikke koent, men ...
Avatar billede fennec Nybegynder
23. marts 2009 - 16:38 #3
Ok, der er jeg så ikke helt med på... Kan du give et eks?
Avatar billede arne_v Ekspert
23. marts 2009 - 16:46 #4
CREATE PROCEDURE dyn(@list VARCHAR(255))
AS
DECLARE @sql VARCHAR(255)
SET @sql = 'SELECT * FROM t1 WHERE f1 IN (' + @list + ')'
EXEC(@sql)
GO
Avatar billede Syska Mester
23. marts 2009 - 20:02 #5
Den her vil vel også Compile en execution plan for hvert forskellig SQL sætning af overstående ?

// ouT
Avatar billede arne_v Ekspert
23. marts 2009 - 20:11 #6
Ja.

Og den muliggoer SQL injection.

Kort sagt: den sucks. Men jeg kender ikke et godt alternativ.
Avatar billede Syska Mester
24. marts 2009 - 00:23 #7
http://www.eksperten.dk/spm/850842

Kig på det spm ... noget jeg selv oprettede i sin tid ... og der står en masse ting om dette emne .. og en løsning.

// ouT
Avatar billede fennec Nybegynder
24. marts 2009 - 09:41 #8
Hej drenge.

Den sql jeg skulle have det ind i viste sig at være lidt genstridig, men via buzzzz's link, fandt jeg en løsning. Jeg var nød til at bruge like metoden :(

Heldigvis kommer parametre fra noget jeg selv generere så injektion er sikret.

Smid et svar buzzzz.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester