Estoy intentando simplemente demostrar aquí que esta función simple no es lo suficientemente bueno para prevenir cada inyección SQL en el mundo:prueban que pueden inyección SQL
Function CleanForSQL(ByVal input As String) As String
Return input.Replace("'", "''")
End Function
Aquí está una instrucción de inserción típica de una de nuestras aplicaciones :
Database.DBUpdate("UPDATE tblFilledForms SET Text1 = '" + CleanForSQL(txtNote.Text) + "' WHERE FilledFormID = " + DGVNotes.SelectedRows(0).Cells("FilledFormID").Value.ToString)
sé que no es seguro, debido a google y buscar otras preguntas sobre StackOverflow.com. Here es una pregunta que encontré en la que todas las funciones como la que presenté anteriormente son irrelevantes e inútiles.
Así que basado en el post que está conectado, simplemente escribiendo
'Chr (8); actualizar tblMaint SET Valor1 = 2 DONDE ValueID = 2--
en txtNote debería ser suficiente para borrar todos los valores de texto1 en toda la tabla tblFilledForms, y luego actualizar segunda fila de la tabla tblmaint sea correcta 2?
lo que debería ocurrir aquí es que VB lo interpretará como
tblFilledForms actualización del conjunto Text1 = '' 'Chr (8); actualizar tblMaint SET Valor1 = 2 DONDE ValueID = 2-- 'DONDE FilledFormID = 5120327
y enviarlo a SQL que se ejecute el pasante Chr (8) para borrar la tercera' que produciría
ACTUALIZACIÓN tblFilledForms SET Text1 = ''; update tblMaint SET Value1 = 2 WHERE ValueID = 2-- 'WHERE FilledFormID = 5120327
para ser realmente ejecutados en la base de datos correcta?
Luego coppied un Chr (8) desde el portapapeles y reemplacé el Chr (8) en el cuadro de texto con el contenido del portapapeles y todavía no lo hago. Pone toda la cadena directamente en el campo sin problemas.
Entonces, ¿qué estoy haciendo mal aquí? o ¿qué más puedo hacer para romperlo?
Tecnologías y fondo: estoy usando MS SQL Server 2005 y Visual Basic .NET 2005. el campo Texto1 en la base de datos es una (600) campo varchar (no pregunte por qué no mi su MAX, es inútil, lo sé) Hay ciertos factores desencadenantes en la tabla que evitarían una actualización masiva como esta y arrojarían algunos errores si la inyección funcionó correctamente.
PS. Sé que las consultas parametrizadas son el camino a seguir aquí y no estoy buscando respuestas como "bueno, no sé por qué no funciona, pero las consultas parametrizadas son el camino a seguir". Estoy buscando la capacidad de demostrar que nuestro software está roto y que tenemos que reescribirlo utilizando mejores principios.
Para cualquiera que lea esta pregunta y descubra cómo filtrar mejor los campos de texto, ¡la respuesta es NO! Use los parámetros! ¡son mucho mejores, más seguros y más fáciles!
Voto a favor de personas amenazantes y redactores principales en lugar de principios en el mismo párrafo. –
Bueno, tu Chr (8) termina dentro de una cadena, por eso SQL no lo está evaluando. –
@Vinko No creo que eso sea justo, simplemente estaba estableciendo una pauta de respuestas.Entonces, en lugar de obtener un montón de respuestas diciendo lo mismo, obtiene 1 o 2 que le dicen lo que quiere. – Zoidberg