Le novità sul nostro software, le info e le curiosità
La SQL injection è una tecnica di attacco informatico che sfrutta le vulnerabilità di sicurezza in un'applicazione web per manipolare le query inviate al database. In pratica, un malintenzionato inserisce codice SQL dannoso all'interno di input che l'applicazione passa poi al database.
I rischi associati a un attacco di SQL injection riuscito sono significativi e possono includere:
Accesso non autorizzato ai dati: Gli aggressori possono visualizzare dati sensibili, come informazioni personali degli utenti, credenziali di accesso, dati finanziari, ecc.
Manipolazione dei dati: È possibile modificare o eliminare dati esistenti nel database, compromettendo l'integrità delle informazioni.
Escalation dei privilegi: Un utente malintenzionato potrebbe ottenere privilegi amministrativi sul database, avendo così il controllo completo.
Esecuzione di comandi sul sistema operativo: In alcuni casi, è possibile eseguire comandi a livello di sistema operativo del server che ospita il database, portando a un controllo ancora più esteso.
Denial of Service (DoS): L'attaccante potrebbe eseguire query che sovraccaricano il database, rendendo l'applicazione inutilizzabile per gli utenti legittimi.
Rivelazione della struttura del database: Gli aggressori possono ottenere informazioni sulla struttura del database, inclusi nomi di tabelle e colonne, facilitando ulteriori attacchi.
Questo è il metodo più efficace e raccomandato per prevenire la SQL injection in CFML.
Invece di concatenare direttamente gli input dell'utente nella stringa SQL, si utilizzano dei segnaposto che vengono poi sostituiti in modo sicuro dal motore del database.
Come funziona:
Il tag <cfqueryparam> assicura che il valore fornito sia trattato come un dato letterale e non come parte eseguibile del codice SQL. Specifica anche il tipo di dato atteso, aggiungendo un ulteriore livello di validazione.
Esempio:
Chiamata Vulnerabile:
<cfquery name="getUser" datasource="myDataSource">
SELECT *
FROM Users
WHERE UserID = #URL.userID#
</cfquery>
In questo esempio, se URL.userID contiene codice SQL malevolo (es. 1 OR 1=1), questo verrà eseguito.
Chiamata Sicura:
<cfquery name="getUser" datasource="myDataSource">
SELECT *
FROM Users
WHERE UserID = <cfqueryparam value="#URL.userID#" cfsqltype="CF_SQL_INTEGER">
</cfquery>
In questo caso, <cfqueryparam> si occupa di trattare URL.userID come un intero. Se viene passato un valore non intero o del codice SQL, la query fallirà o il codice malevolo verrà trattato come un semplice valore e non eseguito.
Attributi importanti di <cfqueryparam>:
value: Il valore da passare alla query.
cfsqltype: Il tipo di dato SQL (es. CF_SQL_INTEGER, CF_SQL_VARCHAR, CF_SQL_TIMESTAMP). È fondamentale specificare il tipo corretto per una maggiore sicurezza.
maxlength: (Opzionale ma raccomandato per i tipi stringa) Specifica la lunghezza massima del valore.
list: (Opzionale) Per passare una lista di valori (es. per la clausola IN).
null: (Opzionale) Indica se il valore può essere NULL
Prima di utilizzare qualsiasi dato proveniente dall'utente (da URL, form, cookie, ecc.) in una query, è essenziale validarlo.
Tipo di dato: Assicurarsi che il dato sia del tipo atteso (numero, stringa, data, ecc.).
Lunghezza: Controllare che la lunghezza del dato sia entro limiti accettabili.
Formato: Verificare che il dato rispetti un formato specifico (es. un indirizzo email, un codice postale).
Whitelist: Se possibile, confrontare l'input con una lista di valori consentiti (whitelist).
Esempio di validazione base:
<cfif structKeyExists(URL, "userID") AND isNumeric(URL.userID)>
<cfset userID = Int(URL.userID)>
<cfelse>
</cfif>
Configurare l'utente del database utilizzato dall'applicazione CFML con i minimi privilegi necessari. Ad esempio, se l'applicazione deve solo leggere dati, non concedere permessi di UPDATE, DELETE o DROP.
Questo limita i danni in caso di attacco riuscito.