Prevención de Inyección SQL

Actualmente estoy trabajando en un proyecto henetworkingado ASP donde la security ahora se ha convertido en una gran preocupación. No solo es un método de encryption inseguro (md5), sino que también me preocupan los problemas de inyección de SQL. Todavía no soy muy bueno con la inyección, y solo he probado lo básico de lo que sé. Encontré la function que "asegura" la input de cualquier usuario, pero me pregunto si realmente está haciendo algo para evitar los ataques de inyección. Aquí está la function:

function sqlfix(input) if not isnull(input) and input <> "" then input = replace(input, ";", ";") input = replace(input, "'", "'") input = replace(input, """", """) input = replace(input, "(", "(") input = replace(input, ")", ")") input = replace(input, "|", "|") input = replace(input, "<", "<") input = replace(input, ">", ">") input = replace(input , "'", "''") 'input = Server.HTMLEncode(input) 'input = Server.UrlEncode(input) sqlfix = input else sqlfix = "" end if end function 

Recuerdo haber hecho algo como esto hace muchos años cuando comencé a PHP con funciones mysql_ *, pero ahora pasé a PDO y enlace de parameters. Sin embargo, no sé qué tan seguro es esto para las aplicaciones ASP. Gracias por cualquier input.

¡No caigas en la trampa de interpolación de strings! No es seguro.

Puede usar parameters de consulta SQL reales incluso en ASP Classic.

No soy un progtwigdor de ASP, pero encontré este blog con un claro ejemplo de utilizar un object ADODB.Command para una consulta SQL parametrizada, y valores de enlace a los parameters antes de la ejecución.

http://securestate.blogspot.com/2008/09/classic-asp-sql-injection-prevention_30.html

Consulte también esta pregunta SO para get más ejemplos de uso de parameters con nombre:

Parámetro nombrado clásico ASP en consulta patwigterizada: debe declarar la variable escalar

Esto es lo más cerca que puedes llegar a PDO en ASP Classic …

 with createobject("adodb.command") .activeConnection = application("connectionstring") .commandText = "select * from sometable where id=?" set rs = .execute( ,array(123)) end with 

¿Cómo puedo hacer una statement preparada en el asp clásico que previene la inyección de sql?

La línea

 input = replace(input , "'", "''") 

está haciendo la mayor parte del trabajo. Lo que he hecho para sitios seguros es varias funciones distintas para cada tipo de datos

 fn_validstring replacing single quotes fn_validnumber testing isnumeric fn_validint leveraging fn_validnumber and rounding fn_bool etc ... 

Reemplazar dynamics con procedimientos almacenados y eliminar todos los permissions excepto ejecutar asegura el entorno independientemente.

PDO y declaraciones preparadas son la mejor manera de evitar las inyecciones de SQL. El código de desinfección de SQL a mano como el anterior es significativamente más peligroso ya que hay muchas cosas que puede perder fácilmente.

El uso de declaraciones preparadas hará que las declaraciones SQL sean seguras.