Per amor di discussione, diciamo solo che ho devo creare una variabile locale contenente una query SQL che ha un inserto:SQL Server: Sanificazione @param contro gli attacchi di iniezione
DECLARE @insert NVARCHAR(MAX)
SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES...
EXEC (@insert)
Questo inserto è anche andando a contenere un valore di colonna:
DECLARE @insert NVARCHAR(MAX)
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
Ora, sono ovviamente preoccupato per un attacco di iniezione, e vorrei assicurare un valore di quel messaggio @ non è possibile effettuare il valore di @ inserto dannoso o malformati come una query a exec .
Questo ci porta alla mia domanda: è sufficiente l'escape dei caratteri in @message? Ci sono altri personaggi che potrebbero apparire in @message che potrebbero sfuggire?
Esempio:
DECLARE @insert NVARCHAR(MAX)
SELECT @message = REPLACE(@message,'''','''''')
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
(quando dico "devono", questo è perché la mia domanda è in una stored procedure, e questa stored procedure accetta @Table, che è la tabella di destinazione di INSERT in. Non sono interessato a discutere la mia architettura o perché la tabella in INSERT è specificata "dinamicamente" tramite un parametro di procedura. Evita di commentare questo a meno che non ci sia un altro modo oltre a EXEC() in una query per specificare una tabella per INSERIRE quando il nome della tabella viene ricevuto come parametro di procedura.)
Vogliamo davvero occuparci di domande che riguardano come scrivere intenzionalmente codice errato? – dkretz
Se significa trovare una soluzione, sì. Gli sviluppatori devono sempre occuparsi del codice crap, specialmente se si consultano e si ereditano progetti scritti in Bangladesh per $ 8/ora. Non sempre otteniamo il lusso di costruire progetti da zero, costruendoli come dovrebbero * essere * stati.:) – core