2009-06-02 14 views
5

Ich habe die unglückliche Aufgabe, eine Reihe von alten ColdFusion-Code zu bereinigen. Überall sind Anfragen, ich arbeite daran, sie alle für eine einfachere Wartung auf gängige CFCs zu verschieben.So überschreiben SQL-Bereinigung in ColdFusion

Ich stoße auf ein Problem, weil cfquery automatisch die einfachen Anführungszeichen in doppelte Anführungszeichen konvertiert. Wie kann ich dieses Verhalten überschreiben?

Weitere Informationen finden Sie weiter unten.


So, hier ist die Abfrage Ich begann mit:

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

Das Seltsame dabei ist, dass eine wörtliche „ausgewählt“ wird, wegen der Art, wie wir es (wieder angezeigt werden soll, ich didn schreib das nicht, ich versuche nur ein bisschen aufzuräumen). So in der gemeinsamen Funktion gibt einen optionalen Parameter für die select-Klausel ist:

<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> 

Hier wird das Problem: Wenn ich in "GroupName AS LastName, '[Group]' AS FirstName" für den strSelectAttributes Parameter übergebe, die Abfrage, die an die Datenbank gesendet wird, ist:

Sie sehen, meine Zitate wurden in eine ungültige Abfrage "bereinigt".

+0

Siehe auch http: // stackoverflow.com/questions/266586/coldfusion-adding-extra-quotes-wenn-konstruieren-datenbankabfragen-in-strings – ale

Antwort

17

Coldfusion entkommt nicht alle einfache Anführungszeichen, sondern nur diejenigen, die in der Abfrage durch variable Interpolation ankommen. Dies ist der Täter:

SELECT #Arguments.strSelectAttributes# 

Dies ist normalerweise eine hilfreiche Sache und eine kleine Verteidigungslinie gegen SQL-Injection-Angriffe. Also Regel Nummer eins ist (hier und überall sonst): Erstellen Sie Ihre SQL-Zeichenfolge nicht aus Variablen.

Wenn Sie positiv auf Verwendung Variablen haben eine SQL-Zeichenfolge zu bauen, trotz aller möglichen negativen Auswirkungen, verwenden Sie die PreserveSingleQuotes() Funktion:

SELECT #PreserveSingleQuotes(Arguments.strSelectAttributes)# 

Diese Funktion stoppt Coldfusion von Auto-Flucht der einfachen Anführungszeichen.

Und jeder andere Funktionsaufruf tut das gleiche, nebenbei bemerkt. Versuchen:

SELECT #LCase(Arguments.strSelectAttributes)# 

was bedeutet, dass PreserveSingleQuotes() ist wirklich nur ein no-op, die eine Zeichenfolge in eine Funktionsergebnis schaltet, verhindert die automatische variable Interpolationsroutine geschieht.

+0

+1 Sehr cool zu wissen. –

7

Rufen Sie preserveSingleQuotes() um Ihre Variable auf. Es wurde speziell zum Schreiben von dynamischem SQL entwickelt. Außerdem sollten Sie cfqueryparam wirklich für Ihre Werte verwenden, und ich hoffe, dass Sie Ihre Eingabe irgendwie bereinigen, so dass arguments.strSelectAttributes so etwas wie '; drop table groups; drin.

+0

danke. Ich kenne sql injection, aber in meinem Fall kommt der Parameter nur von Code, den wir steuern, niemals von einem Benutzer. – Kip

+4

Ich würde nicht verwenden "es wird nur von Code, den wir steuern" als Begründung für das Schreiben einer DAO-Klasse, die sonst anfällig für SQL-Injektion ist. –

+1

SQL Injection ist nicht der einzige Grund für die Verwendung von query bind params. Außerdem kann Ihre DB die Abfrage vorkompilieren und so schneller ausführen. –

-3

Wenn Sie wirklich den Code aufräumen wollen, Schritt zwei konvertiert diese Spaghetti in gespeicherte Prozeduren.