sql >> Base de Datos >  >> RDS >> Sqlserver

¿Este código evita la inyección de SQL?

En respuesta a su pregunta directa:¿Este código evita la inyección de SQL? No

Aquí está la prueba:inserte esta cadena a través del método PrepareString:

Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)

Console.WriteLine(input)
Console.WriteLine(output)

Modifiqué el método GetRecord que publicaste para devolver la cadena SQL completamente preparada en lugar de obtener el registro de la base de datos:

Console.WriteLine(GetRecord(output))

Y esta es la salida

Input  = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query  = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'

Agregue 1 línea adicional de código:

My.Computer.Clipboard.SetText(input)

Y tiene la cadena que necesita copiada directamente en su portapapeles para pegarla en su campo de entrada en el sitio web para completar su inyección SQL:

'; Drop Table TableName; - -

[Teniendo en cuenta que StackOverflow ha omitido los caracteres de control de la salida de la publicación, por lo que tendrá que seguir el ejemplo de código para crear su salida]

Después de ejecutar el método PrepareString, tendrá exactamente el mismo resultado:el código Chr(8) ASCII es el retroceso que eliminará el "'" adicional que está agregando al mío, lo que cerrará su cadena y luego estoy libre de agregar lo que quiera al final. Su PrepareString no ve mi - porque en realidad estoy usando - - con un carácter de retroceso para eliminar el espacio.

El código SQL resultante que está creando ejecutará mi instrucción Drop Table sin obstáculos e ignorará rápidamente el resto de su consulta.

Lo divertido de esto es que puede usar caracteres no imprimibles para omitir básicamente cualquier verificación de caracteres que pueda inventar. Por lo tanto, es más seguro usar consultas parametrizadas (que no es lo que pediste, pero es el mejor camino para evitarlo).