2009-06-02 12 views
5

Ho lo sfortunato compito di ripulire un po 'di vecchio codice ColdFusion. Le query sono dappertutto, sto lavorando per trasferirle tutte su comuni CFC per una manutenzione più semplice.Come sovrascrivere la sanitizzazione SQL in ColdFusion

Si è verificato un problema perché cfquery converte automaticamente le virgolette singole in virgolette doppie. Come posso ignorare questo comportamento?

Ulteriori informazioni specifiche sono di seguito.


Così qui è la domanda ho iniziato con:

<cfquery name="getObjectInfo" datasource="#BaseDS#"> 
    SELECT groupName AS lastname, '[Group]' AS firstname 
    FROM groups 
    WHERE groups.group_id = #objectreference_id# 
</cfquery> 

La cosa strana è che un letterale viene "selezionata", a causa del modo in cui vogliamo visualizzare (ancora una volta, io didn scrivilo, sto solo cercando di ripulirlo un po '). Così nella funzione comune, v'è un parametro opzionale per la clausola SELECT:

<cffunction name="fSelGroup" access="public" returntype="query" 
       hint="Returns query selecting given group."> 

    <cfargument name="intGroupID" type="numeric" required="true" 
       hint="ID of group to be returned." /> 
    <cfargument name="strSelectAttributes" type="string" required="false" 
       hint="Attributes to be selected in query" 
       default="*" /> 

    <cfquery name="getObjectInfo" datasource="#Application.DataSource#"> 
     SELECT #Arguments.strSelectAttributes# 
     FROM Groups 
     WHERE Group_ID = #Arguments.intGroupID# 
    </cfquery> 

    <cfreturn getObjectInfo /> 

    </cffunction> 

qui è il problema: Quando passo in "GroupName AS LastName, '[Group]' AS FirstName" per il parametro strSelectAttributes, la query che viene inviata al database è:

SELECT GroupName AS LastName, ''[Group]'' AS FirstName 
FROM Groups 
WHERE Group_ID = 4 

vedete, mie citazioni ha fatto "puro" in una query non valida.

+0

Vedere anche http: // stackoverflow.it/questions/266586/coldfusion-adding-extra-quotes-when-constructing-database-queries-in-string – ale

risposta

17

ColdFusion non scappa tutte le virgolette singole, ma solo quelle che arrivano nella query tramite l'interpolazione variabile. Questa è l'autore del reato:

SELECT #Arguments.strSelectAttributes# 

Questo di solito è una cosa utile e una piccola linea di difesa contro gli attacchi SQL injection. Quindi la regola numero uno è (qui e altrove): non costruire la tua stringa SQL dalle variabili.

Se dispone positivamente a variabili utilizzare per costruire una stringa SQL, nonostante tutti i possibili effetti negativi, utilizzare la funzione PreserveSingleQuotes():

SELECT #PreserveSingleQuotes(Arguments.strSelectAttributes)# 

Questa funzione arresta ColdFusion da auto-sfuggire le virgolette singole.

E qualsiasi altra chiamata di funzione fa la stessa cosa, a proposito. Prova:

SELECT #LCase(Arguments.strSelectAttributes)# 

che significa che PreserveSingleQuotes() è in realtà solo un no-op che trasforma una stringa in conseguenza funzione, impedendo la procedura automatica interpolazione variabile accada.

+0

+1 Molto interessante da sapere. –

7

Effettuare una chiamata a preserveSingleQuotes() attorno alla variabile. È realizzato appositamente per la scrittura di SQL dinamico. Inoltre, dovresti davvero usare cfqueryparam per i tuoi valori, e spero tu stia disinfettando il tuo input in qualche modo in modo che arguments.strSelectAttributes non contenga qualcosa come '; drop groups groups; dentro.

<cfquery name="getObjectInfo" datasource="#Application.DataSource#"> 
    SELECT #preserveSingleQuotes(Arguments.strSelectAttributes)# 
    FROM Groups 
    WHERE Group_ID = <cfqueryparam value="#Arguments.intGroupID#" cfsqltype="cf_sql_integer"/> 
</cfquery> 
+0

grazie. Sono a conoscenza di SQL injection, ma nel mio caso il parametro proviene solo dal codice che controlliamo, mai da un utente. – Kip

+4

Non userei "viene chiamato solo dal codice che controlliamo" come giustificazione per scrivere una classe DAO che è altrimenti vulnerabile all'iniezione SQL. –

+1

SQL Injection non è l'unica ragione per utilizzare i parametri di binding della query. Consente inoltre al tuo database di precompilare la query, rendendola più veloce. –

-3

Se si vuole veramente ripulire il codice, il passaggio due consiste nel convertire gli spaghetti in stored procedure.