Me doy cuenta de que las consultas SQL parametrizadas son la forma óptima de desinfectar la entrada del usuario al crear consultas que contienen entrada del usuario, pero me pregunto qué hay de malo en tomar la entrada del usuario y escapar de las comillas simples y rodear toda la cadena con comillas simples. Aquí está el código:
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
Cualquier comilla simple que ingrese el usuario se reemplaza con comillas simples dobles, lo que elimina la capacidad de los usuarios para finalizar la cadena, por lo que cualquier otra cosa que puedan escribir, como punto y coma, signos de porcentaje, etc., formará parte de la cadena y en realidad no se ejecuta como parte del comando.
Estamos utilizando Microsoft SQL Server 2000, por lo que creo que la comilla simple es el único delimitador de cadena y la única forma de escapar del delimitador de cadena, por lo que no hay forma de ejecutar nada que el usuario escriba.
No veo ninguna manera de lanzar un ataque de inyección SQL contra esto, pero me doy cuenta de que si esto fuera tan a prueba de balas como me parece, alguien más lo habría pensado y sería una práctica común.
¿Qué hay de malo con este código? ¿Hay alguna manera de obtener un ataque de inyección SQL más allá de esta técnica de desinfección? Sería muy útil la entrada de muestra del usuario que explota esta técnica.
ACTUALIZAR:
Todavía no conozco ninguna forma de lanzar efectivamente un ataque de inyección SQL contra este código. Algunas personas sugirieron que una barra invertida escaparía a una comilla simple y dejaría que la otra terminara la cadena para que el resto de la cadena se ejecute como parte del comando SQL, y me doy cuenta de que este método funcionaría para inyectar SQL en una base de datos MySQL, pero en SQL Server 2000 la única forma (que he podido encontrar) de escapar de una comilla simple es con otra comilla simple; las barras invertidas no lo harán.
Y a menos que haya una manera de detener el escape de la comilla simple, ninguna de las entradas del resto del usuario se ejecutará porque se tomará como una cadena contigua.
Entiendo que hay mejores formas de desinfectar la información, pero estoy realmente más interesado en saber por qué el método que proporcioné anteriormente no funcionará. Si alguien sabe de alguna forma específica de montar un ataque de inyección SQL contra este método de desinfección, me encantaría verlo.