Frage

Ich habe die unglückliche Aufgabe der Reinigung eine Reihe von altem Coldfusion-Code auf. Abfragen werden alle über den Ort, arbeite ich an, sie alle zu gemeinsamen FCKW für einfachere Wartung zu bewegen.

ich in ein Problem laufen lasse, weil cfquery automatisch die einfachen Anführungszeichen an doppelsträngige Apostrophe zu konvertieren. Wie kann ich dieses Verhalten außer Kraft setzen?

Weitere spezifische Informationen sind unten.


Hier ist also 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 angezeigt werden soll (wieder, ich habe das nicht schreiben, ich versuche nur, um es zu reinigen ein wenig nach oben). So in der gemeinsamen Funktion, gibt es einen optionalen Parameter für die select-Klausel:

  <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 ist das Problem : Wenn ich in "GroupName AS LastName, '[Group]' AS FirstName" für den strSelectAttributes Parameter übergeben, die Abfrage, die an die Datenbank gesendet wird, ist:

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

Sie sehen, habe meine Anführungszeichen „hygienisiert“ in einen ungültigen Abfrage.

War es hilfreich?

Lösung

Coldfusion nicht entkommen 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. So eine Regel Nummer (hier und überall sonst): Seien Sie nicht Ihre SQL-Zeichenfolge von Variablen bauen.

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

SELECT #PreserveSingleQuotes(Arguments.strSelectAttributes)#

Diese Funktion stoppt Coldfusion aus den einfachen Anführungszeichen Auto-entkommen.

Und anderer Funktionsaufruf macht das Gleiche, übrigens. Versuchen Sie:

SELECT #LCase(Arguments.strSelectAttributes)#

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

Andere Tipps

Setzen Sie einen Anruf an preserveSingleQuotes () um Ihre Variable. Es ist speziell für das Schreiben von dynamischen SQL gemacht. Auch Sie wirklich, sollten wirklich cfqueryparam für Ihre Werte verwenden, und ich hoffe, du bist Desinfizieren Sie Ihre Eingabe irgendwie so, dass arguments.strSelectAttributes nicht so etwas wie ‚enthalten kann; Drop Tischgruppen; in ihm.

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

Wenn Sie wirklich der Code Schritt zwei zu wollen, um aufzuräumen konvertiert, dass Spaghetti in Stored Procedures.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top