Por el bien del argumento, digamos que me tengo que crear una variable local que contiene una consulta SQL que tiene una inserción:SQL Server: Desinfección @param contra ataques de inyección
DECLARE @insert NVARCHAR(MAX)
SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES...
EXEC (@insert)
Este tubo es también va a contener un valor de columna:
DECLARE @insert NVARCHAR(MAX)
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
Ahora, obviamente estoy preocupado por un ataque de inyección, y me gustaría para garantizar el valor de ese mensaje @ no puede tomar el valor de @ inserción malicioso o mal formado como una consulta a EXEC .
Esto nos lleva a mi pregunta: ¿es suficiente escaparse de los 'caracteres en @message? ¿Hay algún otro personaje que pueda aparecer en @mensaje que pueda escapar?
Ejemplo:
DECLARE @insert NVARCHAR(MAX)
SELECT @message = REPLACE(@message,'''','''''')
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
(cuando digo "tienen que", esto se debe a mi consulta es en un procedimiento almacenado, y este procedimiento almacenado acepta @table, que es la tabla de destino a INSERT En. No estoy interesado en discutir mi arquitectura o por qué la tabla para INSERTAR se especifica "dinámicamente" a través de un parámetro de procedimiento. Por favor, abstente de comentar en este a menos que exista otra forma además de EXEC() de consultar para especificar una tabla para INSERTAR en cuando el nombre de la tabla se recibe como un parámetro de procedimiento).
¿Realmente queremos ocuparnos de las preguntas relacionadas con la forma intencional de escribir código incorrecto? – dkretz
Si eso significa encontrar una solución, sí. Los desarrolladores deben lidiar con el código basura todo el tiempo, especialmente si consultan y heredan proyectos escritos en Bangladesh por $ 8/hr. No siempre nos damos el lujo de construir proyectos desde cero, construirlos de la manera que deberían * haber * sido.:) – core