Proteggi i comportamenti del server ColdFusion di Dreamweaver dagli attacchi SQL injection.
Rischio di protezione da attacchi SQL injection
Alcuni database consentono di inviare le istruzioni SQL in una singola query. Per questo motivo, esistono potenziali rischi relativi alla protezione quando i parametri in una stringa di query vengono passati a una query di database generata dinamicamente. I pirati informatici potrebbero provare a modificare l’URL o le variabili di modulo in una query dinamica aggiungendo istruzioni SQL dannose ai parametri esistenti. Questa operazione viene spesso definita come attacco SQL injection. Alcuni dei codici di comportamento del server creati da Dreamweaver dovrebbero essere modificati per ridurre il rischio di attacchi SQL injection. Per ulteriori informazioni su SQL injection, consulta questo articolo di Wikipedia.
Nota: il problema descritto in questo articolo è stato corretto in Dreamweaver 8.0.2 Updater.
Soluzione: aggiorna i comportamenti del server
Quando consenti a una stringa di query di passare un parametro, verifica che venga passata solo l’informazione prevista. Adobe ha creato Dreamweaver 8.0.2 Updater che riduce il rischio di attacchi SQL injection. Queste correzioni sono incorporate in tutte le versioni successive di Dreamweaver. Dopo l’aggiornamento di Dreamweaver 8, sarà necessario riapplicare i comportamenti del server alle pagine che li utilizzano, quindi ridistribuire tali pagine al server.
Il promemoria di questo documento descrive come modificare manualmente il codice Dreamweaver MX 2004 per impedire gli attacchi SQL injection con il modello server ColdFusion. I comportamenti del server vulnerabili a questi attacchi sono elencati di seguito, insieme a queste correzioni:
- Recordset con un filtro
- Comportamento server Inserisci record e Procedura guidata Modulo inserimento record
- Aggiorna record e Procedura guidata Modulo aggiornamento record
- Comportamento server Elimina record
- Comportamento server Esegui login utente
- Comportamento server Controlla nuovo utente
- Set pagine principale/dettaglio
Recordset con un filtro
I recordset non filtrati non devono essere modificati, ma l’operazione deve essere eseguita per i recordset filtrati. Nell’esempio riportato di seguito, un recordset Dreamweaver MX 2004 denominato “Recordset1” è filtrato da un valore ID passato da un parametro URL. Il codice evidenziato di seguito è ciò che deve essere modificato:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>
Per proteggere il recordset dagli attacchi SQL injection, utilizza il tag cfqueryparam all’interno del tag cfquery che contiene l’istruzione SQL SELECT. Il tag cfqueryparam verificherà il tipo di dati del parametro query e aiuterà a proteggere i database dagli utenti non autorizzati. La linea in giallo è il codice di sicurezza modificato:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
Comportamenti server Inserisci record e Procedura guidata Modulo inserimento record
Per proteggere il recordset dagli attacchi SQL injection, utilizza il tag cfqueryparam all’interno del tag cfquery che contiene l’istruzione SQL INSERT. Il tag cfqueryparam verificherà il tipo di dati del parametro query e aiuterà a proteggere i database dagli utenti non autorizzati.
Codice originale. Il codice evidenziato di seguito è ciò che dovrà essere modificato:
<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>
Codice sicuro modificato:
<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: scegli i valori cfslqtype e maxlength appropriati per i dati.
Aggiorna record e Procedura guidata Modulo aggiornamento record
Il comportamento server Aggiorna record e la procedura guidata modulo aggiornamento record richiedono una combinazione delle correzioni sopra illustrate. Per prima cosa, cerca il tag cfquery che contiene l’istruzione SQL SELECT e modificalo come descritto in Recordset con un filtro. Quindi, cerca il tag cfquery che contiene l’istruzione SQL UPDATE e modificalo come descritto in Comportamenti server Inserisci record e Procedura guidata Modulo inserimento record.
Comportamento server Elimina record
La modifica del comportamento server Elimina record è simile a quella per Recordset con un filtro.
Codice originale:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>
Codice di sicurezza modificato:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
Nota: scegli i valori cfslqtype e maxlength appropriati per i dati.
Comportamento server Esegui login utente
Per correggere il codice di comportamento server Esegui login utente, cerca i tag cfquery e aggiungi i tag cfqueryparam.
Codice originale:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#' AND LAST_NAME='#FORM.textfield2#'</cfquery>
Codice sicuro modificato:
<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: scegli i valori cfslqtype e maxlength appropriati per i dati.
Comportamento server Controlla nuovo utente
Il comportamento server Controlla nuovo utente richiede che un comportamento server Inserisci record sia aggiunto prima alla pagina. Per prima cosa, cerca il tag cfquery che contiene l’istruzione SQL SELECT e modificalo come descritto in Recordset con un filtro. Quindi, cerca il tag cfquery che contiene l’istruzione SQL INSERT e modificalo come descritto in Comportamenti server Inserisci record e Procedura guidata Modulo inserimento record.
Set pagine principale/dettaglio
Per l’oggetto di applicazione Set pagine principale/dettaglio, le modifiche sono effettuate principalmente nel recordset creato da Dreamweaver per la pagina del dettaglio. Se non disponi di un recordset filtrato nella pagina principale, nessuna modifica deve essere effettuata alla pagina principale. Se disponi di un recordset filtrato nella pagina principale, visualizza Recordset con un filtro per aggiornare il codice recordset.
Per la pagina dei dettagli, cerca il tag cfquery che contiene l’istruzione SQL SELECT e modificalo come descritto in Recordset con un filtro.
Informazioni aggiuntive
Adobe consiglia di utilizzare il tag cfqueryparam all’interno di ogni tag cfquery per aiutare a proteggere i database dagli utenti non autorizzati. Per ulteriori informazioni, consultate:
- Miglioramento della sicurezza con cfqueryparam
- Bollettino sulla sicurezza di Adobe: APSB 06-07 Dreamweaver Server Behavior SQL Injection vulnerability
Accedi al tuo account