Proteja los comportamientos de ColdFusion Server de Dreamweaver de ataques de inyección SQL.

Riesgo de seguridad de ataques de inyección SQL

Algunas bases de datos permiten enviar varias sentencias SQL en una sola consulta. Por este motivo, hay potenciales riesgos de seguridad al pasar parámetros de una cadena de consulta a una consulta de base de datos generada dinámicamente. Los piratas informáticos pueden intentar modificar la URL o variables de formulario de una consulta dinámica anexando sentencias SQL maliciosas a parámetros ya existentes. Esta acción suele denominarse ataque de inyección SQL. Es conveniente modificar parte del código de comportamiento del servidor creado por Dreamweaver para reducir el riesgo de ataques de inyección SQL. Para obtener información más detallada sobre la inyección SQL, lea esteartículo de la Wikipedia.

Nota: el problema que se explica en este artículo se solucionó en el el actualizador de Dreamweaver 8.0.2.

Solución: actualizar los comportamientos del servidor

Al permitir que una cadena de consulta pase un parámetro, asegúrese de que solo se pase la información prevista. Adobe creó el actualizador de Dreamweaver 8.0.2, que reduce el riesgo de ataques de inyección SQL. Estas correcciones se incorporan en todas las versiones posteriores de Dreamweaver. Tras actualizar Dreamweaver 8, debe volver a aplicar los comportamientos del servidor en las páginas que los utilizan y, a continuación, volver a implementar dichas páginas en el servidor.

El resto de este documento explica cómo editar manualmente el código de Dreamweaver MX 2004 para prevenir los ataques de inyección SQL con el modelo ColdFusion Server. A continuación se enumeran los comportamientos del servidor vulnerables a estos ataques, junto con las correcciones:

Juego de registros con un filtro

No hace falta modificar los juegos de registros sin filtrar; sin embargo, es necesario modificar los juegos de registros filtrados. En el ejemplo siguiente, un juego de registros de Dreamweaver MX 2004 denominado "Recordset1" se filtra por un valor de ID pasado desde un parámetro de URL. Debe cambiarse el código resaltado a continuación:

<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>

Para proteger el juego de registros de ataques de inyección SQL, use la etiqueta cfqueryparam en la etiqueta cfquery que contiene la sentencia SQL SELECT. La etiqueta cfqueryparam verificará el tipo de datos del parámetro de consulta y ayudará a proteger las bases de datos contra usuarios no autorizados. La línea de color amarillo es el código seguro modificado:

<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>

Comportamientos del servidor Insertar registro y del Asistente de formulario de inserción de registros

Para proteger el juego de registros de ataques de inyección SQL, use la etiqueta cfqueryparam en la etiqueta cfquery que contiene la sentencia SQL INSERT. La etiqueta cfqueryparam verificará el tipo de datos del parámetro de consulta y ayudará a proteger las bases de datos contra usuarios no autorizados.

Código original. Debe cambiarse el código resaltado a continuación:

<cfquery datasource="cafetownsend">   INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE)   VALUES (<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ "">'#FORM.textfield1#'<cfelse>NULL</cfif>   ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ "">'#FORM.textfield2#'<cfelse>NULL</cfif>   ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ "">'#FORM.textfield3#'<cfelse>NULL</cfif>   )</cfquery>

Código seguro modificado:

<cfquery datasource="cafetownsend">   INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE)   VALUES<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ ""><cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif>   ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ ""><cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif>   ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ ""><cfqueryparam value="#FORM.textfield3#" cfsqltype="cf_sql_clob" maxlength="20"><cfelse>''</cfif>   )</cfquery>

Nota: elija los valores apropiados de cfslqtype y maxlength para los datos.

Servidor Actualizar registro y Asistente de formulario de actualización de registros

El comportamiento del servidor Actualizar registro y Asistente de formulario de actualización de registros requiere una combinación de las correcciones indicadas antes. En primer lugar, busque la etiqueta cfquery que contiene la secuencia SQL SELECT y modifíquela tal como se explica en Juego de registros con un filtro. A continuación, busque la etiqueta cfquery que contiene la sentencia SQL UPDATE y modifíquela tal como se explica en Comportamientos del servidor Insertar registro y del Asistente de formulario de inserción de registros.

Comportamiento del servidor Eliminar registro

La modificación del comportamiento del servidor Eliminar registro es a la que se explica en Juego de registros con un filtro.

Código original:

<cfquery datasource="cafetownsend">    DELETE FROM COMMENTS    WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>

Código seguro modificado:

<cfquery datasource="cafetownsend">   DELETE FROM COMMENTS   WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>

Nota: elija los valores apropiados de cfslqtype y maxlength para los datos.

Comportamiento del servidor Conectar usuario

Para corregir el código de comportamiento del servidor Conectar usuario, busque las etiquetas cfquery y añada etiquetas cfqueryparam.

Código original:

<cfquery name="MM_rsUser" datasource="cafetownsend">   SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#'   AND LAST_NAME='#FORM.textfield2#'</cfquery>

Código seguro modificado:

<cfquery name="MM_rsUser" datasource="cafetownsend">   SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME=<cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50">   AND LAST_NAME=<cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"></cfquery>

Nota: elija los valores apropiados de cfslqtype y maxlength para los datos.

Comportamiento del servidor Comprobar nuevo nombre de usuario

El comportamiento del servidor Comprobar nuevo nombre de usuario requiere añadir primero a la página un comportamiento del servidor Insertar registro. En primer lugar, busque la etiqueta cfquery que contiene la sentencia SQL SELECT y modifíquela tal como se explica en Juego de registros con un filtro. A continuación, busque la etiqueta cfquery que contiene la sentencia SQL INSERT y modifíquela tal como se explica en Comportamientos del servidor Insertar registro y del Asistente de formulario de inserción de registros.

Juego de páginas Maestro-Detalle

En el caso del objeto de aplicación de juego de páginas Maestro-Detalle, los cambios se dan sobre todo en el juego de registros creado por Dreamweaver para la página de detalles. Si no tiene un juego de registros filtrados en la página maestra, no hace falta efectuar cambios en ella. Si tiene un juego de registros filtrados en la página maestra, vaya a Juego de registros con un filtro para actualizar el código de juego de registros.

En el caso de la página de detalles, busque la etiqueta cfquery que contiene la sentencia SQL SELECT y modifíquela tal como se explica en Juego de registros con un filtro.

Información adicional

Adobe recomienda el uso de la etiqueta cfqueryparam en cada etiqueta cfquery para proteger las bases de datos contra usuarios no autorizados. Para obtener más información, consulte:

Esta obra está autorizada con arreglo a la licencia de Reconocimiento-NoComercial-CompartirIgual 3.0 Unported de Creative Commons.  Los términos de Creative Commons no cubren las publicaciones en Twitter™ y Facebook.

Avisos legales   |   Política de privacidad en línea