Vai alla seconda riga nella visualizzazione codice, subito dopo il file di inclusione per la connessione, e aggiungi la funzione GetSQLValueString() all'inizio del codice come segue:
<?php if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } } ?>
Problema
Alcuni database consentono di inviare le istruzioni SQL in una singola query. Pertanto, esistono potenziali rischi di sicurezza quando passi parametri in una stringa di richiesta a una richiesta di database generata dinamicamente. Gli hacker potrebbero tentare di modificare URL o 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. (Rif. 201713)
Nota: Il problema descritto in questa TechNote è stato risolto nell'Aggiornamento Dreamweaver 8.0.2.
Questa TechNote riguarda i comportamenti server PHP di Dreamweaver. Esistono TechNote separate per i comportamenti server ColdFusion, ASP VBScript, ASP JavaScript e JSP. I comportamenti server ASP.NET non subiscono modifiche.
Soluzione
Quando consenti a una stringa di query di passare un parametro, verifica che venga passata solo l’informazione prevista. Adobe ha creato un Aggiornamento Dreamweaver 8.0.2 che riduce il rischio di attacchi SQL injection. Queste correzioni saranno incorporate in tutte le versioni future di Dreamweaver. Dopo l'aggiornamento di Dreamweaver 8, dovrai riapplicare i comportamenti server alle pagine che li utilizzano e ripubblicare quelle pagine sul server.
Il resto di questa TechNote documenta come modificare manualmente il codice Dreamweaver MX 2004 per prevenire gli attacchi SQL injection con il modello server PHP. I comportamenti server vulnerabili a questi attacchi sono elencati di seguito, insieme alle correzioni:
Recordset con un filtro
I recordset non filtrati non devono essere modificati, ma l’operazione deve essere eseguita per i recordset filtrati. Nell'esempio seguente, un recordset Dreamweaver MX 2004 denominato "rs_byDate" è filtrato da un Valore data passato da un parametro URL. Il codice evidenziato di seguito è quello da modificare:
<?php $colname_rs_byDate = "1"; if (isset($_GET['relDate'])) { $colname_rs_byDate = (get_magic_quotes_gpc()) ? $_GET['relDate'] : addslashes($_GET['relDate']); } mysql_select_db($database_dreamqa2, $dreamqa2); $query_rs_byDate = sprintf("SELECT * FROM albums WHERE relDate = '%s'", $colname_rs_byDate); $rs_byDate = mysql_query($query_rs_byDate, $dreamqa2) or die(mysql_error()); $row_rs_byDate = mysql_fetch_assoc($rs_byDate); $totalRows_rs_byDate = mysql_num_rows($rs_byDate); ?>
Per proteggere il recordset dagli attacchi SQL injection, crea una funzione personalizzata GetSQLValueString() nella parte superiore della pagina. Questa funzione verifica il tipo di dati del parametro della richiesta. Una volta creata la funzione, aggiorna il codice del recordset per utilizzare la funzione GetSQLValueString().
Codice modificato:
$colname_rs_byDate = $_GET['relDate'];
Aggiorna il codice recordset per creare una stringa SQL utilizzando la funzione GetSQLValueString() creata sopra. Aggiorna il valore della variabile $query_rs_byDate:
Codice originale:
$query_rs_byDate = sprintf("SELECT * FROM albums WHERE relDate = '%s'", $colname_rs_byDate);
Codice sicuro modificato:
$query_rs_byDate = sprintf("SELECT * FROM album WHERE relDate = %s", GetSQLValueString($colname_rs_byDate, "date"));
Comportamenti server Inserisci, Aggiorna ed Elimina record e procedura guidata per il modulo di inserimento record
I comportamenti server Inserisci, Aggiorna ed Elimina Record e l'autocomposizione Modulo di Inserimento Record utilizzano già la funzione GetSQLValueString(), quindi devono essere perfezionati per prevenire le SQL injection. Le uniche modifiche necessarie sono nella funzione GetSQLValueString().
Ecco il codice originale. La riga da cambiare è evidenziata in giallo:
if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") {$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue; switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } }
Aggiorna la definizione della variabile $theValue:
Codice originale:
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
Codice protetto modificato:
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
Comportamento server Esegui login utente
Ecco i passaggi per correggere il comportamento server Accedi utente:
Modifica il codice che costruisce la query SQL di accesso.
Codice originale:
$LoginRS__query=sprintf("SELECT username, password FROM login WHERE username='%s' AND password='%s'", get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password));
Codice sicuro modificato:
$LoginRS__query=sprintf("SELECT username, password FROM login WHERE username=%s AND password=%s", GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text"));
Comportamento server Controlla nuovo utente
Il comportamento server Controlla nuovo utente richiede che un comportamento server Inserisci record sia aggiunto prima alla pagina. La funzione GetSQLValuesString() è inclusa nel comportamento server Inserisci record. È necessario aggiornare GetSQLValuesString() per gestire meglio l'iniezione SQL e aggiornare il comportamento server Verifica nuovo utente per utilizzare questa funzione quando viene passato un parametro.
Modifica il codice per costruire la richiesta SQL di accesso per utilizzare GetSQLValuesString() per passare i parametri. Nella parte superiore della pagina, individua il codice nella sezione che inizia con // *** Redirect if username exists.
Codice originale:
$LoginRS__query = "SELECT username FROM login WHERE username='" .$loginUsername . "'"
Codice protetto modificato:
$LoginRS__query = sprintf("SELECT username FROM login WHERE username=%s", GetSQLValueString($loginUsername, "text"));
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, consulta recordset con filtro per aggiornare il codice del recordset.
Dreamweaver crea un recordset filtrato nella pagina dettaglio, quindi il codice del recordset deve essere aggiornato per utilizzare una funzione GetSQLValueString() per passare i parametri e sprintf() per costruire la stringa SQL.
Aggiorna il codice di dichiarazione della variabile e costruisci la query SQL utilizzando la funzione GetSQLValuesString().
Codice originale:
$recordID = $_GET['recordID']; $query_DetailRS1 = "SELECT * FROM albums WHERE ID = $recordID";
Codice protetto modificato:
$colname_DetailRS1 = "-1"; if (isset($_GET['recordID'])) { $colname_DetailRS1 = (get_magic_quotes_gpc()) ? $_GET['recordID'] : addslashes($_GET['recordID']); } $query_DetailRS1 = sprintf("SELECT * FROM albums WHERE ID = %s", GetSQLValueString($colname_DetailRS1, "int"));
Procedura guidata modulo aggiornamento record
Informazioni aggiuntive
Per ulteriori informazioni sull'iniezione SQL, consulta il seguente articolo: Articolo di Wikipedia sull'iniezione SQL.
Bollettino di sicurezza Adobe: APSB 06-07 Vulnerabilità di iniezione SQL del Server Behavior di Dreamweaver.
Crea splendidi siti web con Dreamweaver
Progetta, codifica e gestisci siti web dinamici con un potente strumento completo.