Evitar errores de SQL al insertar cadenas en ASP

 

Muchos desarrolladores simplemente introducen las cadenas recibidas desde su Web en la base de datos sin comprobarlas. Y ese es un gran problema de seguridad, aunque un usuario sin experiencia no podría hacer mucho más que causar un error 500 en nuestro servidor, otros podrían hasta bloquear los servicios o eliminar información sensible.

Para evitar este tipo de errores es vital que creemos una función que se dedique a "sanear" las cadenas recibidas por formularios, querys, etc. Su aplicación es muy sencilla y puede salvarnos de perdidas que nos traerán verdaderos dolores de cabeza.

Seguro que muchos de vosotros no os explicáis porque nos devuelve un error el servidor cuando intentamos grabar una comilla simple en la base de datos. Pues esa pregunta tiene una fácil respuesta, "Porque nos desmonta la consulta SQL", veamos un ejemplo práctico.

Tenemos esta consulta:
Insert Into usuarios (nombre, apellidos) Values ('Pepe', 'Montoya');

En un principio es una consulta normal, ¿pero que pasaría si el usuario ingresara en el nombre este dato?; "Pepe's", que la consulta quedaría así:
Insert Into usuarios (nombre, apellidos) Values ('Pepe's', 'Montoya');

Indudablemente la consulta SQL generaría un error, porque hay una comilla que sobra, para evitar esto, simplemente tenemos que añadir una nueva comilla simple haciendo un reemplazo del campo de texto, una función válida podría ser esta:

<%
Function Sanea(Texto)
Sanea = Replace(Texto, "'", "''")
End Function
%>

Antes de grabar cualquier cadena, sería conveniente pasarla para limpiar los datos:

SQL = "Insert Into usuarios (nombre, apellidos) Values ('" & Sanea(TextoNombre) & "', '" & Sanea(TextoApellido) & "');"

Donde TextoNombre y TextoApellido son los campos del formulario que vamos a guardar.

Además de esta pequeña instrucción es conveniente que nos preparemos para otra técnicas que nos pueden afectar como por ejemplo la inyección SQL, pero para eso os he añadido un manual en los artículos relacionados donde disponéis de más información.