Ich habe meine Select Insert-Anweisung und ich frage mich, ob ich meinen Code von SQL-Injektion verhindern sollte. Dieser Code verwendet BULK Insert
und TEMP TABLE
. Ich habe das vorher noch nie benutzt und mir ist nicht bekannt, ob ich in diesem Fall cfqueryparam
verwenden kann oder sonst noch etwas, das ich in diesem Fall anwenden kann? Hier ist mein Code:Wie verhindert man die SQL-Injektion in Select Insert?
<cfquery datasource="testDB" name="InsertBulk">
IF OBJECT_ID('tempdb..##TEMP_TBL') IS NOT NULL DROP TABLE ##TEMP_TBL;
CREATE TABLE ##TEMP_TBL (#cols#)
BULK INSERT ##TEMP_TBL
FROM 'D:\myFiles\myTXT.txt'
WITH (
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
)
</cfquery>
<cfquery datasource="testDB" name="InsertUpdate">
INSERT INTO myRecords(
FIRST_NAME,
LAST_NAME,
GENDER,
DOB
)
SELECT
CASE WHEN LEN(LTRIM(RTRIM(FIRST_NAME))) <> 0 OR FIRST_NAME <> 'NULL' THEN FIRST_NAME END,
CASE WHEN LEN(LTRIM(RTRIM(LAST_NAME))) <> 0 OR LAST_NAME <> 'NULL' THEN LAST_NAME END,
CASE WHEN LEN(LTRIM(RTRIM(GENDER))) <> 0 OR GENDER <> 'NULL' THEN GENDER END,
CASE WHEN LEN(LTRIM(RTRIM(BIRTH_DATE))) <> 0 OR BIRTH_DATE <> 'NULL' THEN BIRTH_DATE END
FROM ##TEMP_TBL AS TempInsert
WHERE NOT EXISTS (
SELECT *
FROM myRecords AS Dups
WHERE Dups.userID = TempInsert.user_ID
)
UPDATE Records
SET
Records.FIRST_NAME = CASE WHEN LEN(LTRIM(RTRIM(Temp.FIRST_NAME))) <> 0 OR Temp.FIRST_NAME <> 'NULL' THEN Temp.FIRST_NAME END,
Records.LAST_NAME = CASE WHEN LEN(LTRIM(RTRIM(Temp.LAST_NAME))) <> 0 OR Temp.LAST_NAME <> 'NULL' THEN Temp.LAST_NAME END,
Records.GENDER = CASE WHEN LEN(LTRIM(RTRIM(Temp.GENDER))) <> 0 OR Temp.GENDER <> 'NULL' THEN Temp.GENDER END,
Records.DOB = CASE WHEN LEN(LTRIM(RTRIM(Temp.BIRTH_DATE))) <> 0 OR Temp.BIRTH_DATE <> 'NULL' THEN Temp.BIRTH_DATE END,
FROM myRecords AS Records
INNER JOIN ##TEMP_TBL AS Temp
ON Records.userID = Temp.user_ID
WHERE Records.userID = Temp.user_ID
</cfquery>
Ich habe mein Problem mit Masse genähert, weil ich versuchte, INSERT/UPDATE
-Anweisungen cfloop
und Erstellen mehrere zu vermeiden.
Fragen, ob eine bestimmte Sache "ok" ist, ist in Ordnung auf Stack Overflow, aber für mehr Open-End "Verbesserung" Anfragen ist codereview.stackexchange.com besser geeignet. In diesem Sinne habe ich die letzten Sätze aus Ihrer Frage entfernt. – Matt
@Matt Ich habe noch nicht von den beiden oben genannten gehört. Danke für die Information. –