Artikel - Detailansicht

Icon Aktuelles Abfragen externer Datenbanken per HTTP

Access-Datenbanken müssen üblicherweise auf dem gleichen Server wie der CF-Server installiert sein damit sie als Datenbanken eingebunden werden können. Liegt eine Access-DB auf einem externen Server kann man diese normalerweise nicht ansprechen.
'Richtige' Datenbankserver, die auf einer externen Maschine liegen, lassen sich vom CF-Server aus einbinden, solange keine Firewall dazwischen liegt und der Port der Datenbank nicht gesperrt ist.
Ist der Port der DB für externe Zugriffe gesperrt, kommt man auch da mit CF nicht so einfach ran.

Eine einfache Lösung für dieses Problem ist ein Script auf dem externen System zu installieren und über dieses Interface die Datenbank abzufragen.
Vorraussetzung dafür ist, das dort ein CF-Server läuft, auf dem ein funktionierender DSN zur Datenbank eingerichtet ist, dann ist die Abfrage z.b. externer Access-DB's kein Problem mehr.

Das ganze funktioniert dann folgendermassen: Anstatt ein <cfquery> direkt auszuführen posten wir die nötigen Daten (DSN, Username, Password) zum externen Script und erhalten von dort ein WDDX-Paket mit einem serialisierten Queryset.
Das konvertieren wir dann zurück und haben unser gewünschtes Queryset von der externen Datenbank.

Für das folgende Beispiel sei folgendes vorausgesetzt:

Der externde CF-Server, der auf die Datenbank zugreifen kann, soll unter dem Domain www.extern.de erreichbar sein. Dort muss der DSN 'myDSN' eingerichtet sein.
Das Script getQuery.cfm liegt auf dem Server www.extern.de und ist erreichbar.
Auf dem lokalen CF-Server liegt die Datei request.cfm. Diese soll die Abfrage auf dem externen System durchführen und das Ergebnis anzeigen:

request.cfm:

<body>

<!--- Struktur mit Daten fuer die Abfrage erstellen --->
<cfset strRequest=StructNew()>
<cfset strRequest.sDatasource="myDSN">
<cfset strRequest.sPassword="sa">
<cfset strRequest.sUsername="geheim">
<cfset strRequest.mSQL="select * from Tabelle where id>10">

<!--- Struktur in WDDX konvertieren --->
<cfwddx action="CFML2WDDX"
  input="#strRequest#"
  output="wRequest">

<!--- externen Server die Anfrage schicken und Ergebnis holen --->
<cfhttp url="http://www.extern.de/getQuery.cfm" method="POST">
  <cfhttpparam type="FORMFIELD" name="wRequest" value="#wRequest#">
</cfhttp>


<!--- Ergebniss als wddx ausgeben--->
<form>
<textarea cols="50" rows="10">
<cfoutput>#HTMLEditFormat(CFHTTP.FileContent)#</cfoutput>
</textarea>
</form>

<!--- Ergebnis in ein Queryset konvertieren --->
<cfwddx action="WDDX2CFML"
  input="#CFHTTP.FileContent#"
  output="qData">


<!--- Queryset ausgeben --->
<table border="1">
<tr>
<cfloop index="column" list="#qData.ColumnList#">
  <cfoutput>
<td>#column#</td></cfoutput>
</cfloop>
</tr>

<cfoutput query="qData">
  <tr>
  <cfloop index="column" list="#qData.ColumnList#">
    <cfset value=evaluate("qData.#column#")>
    <td>#HTMLEditFormat(value)#</td>
  </cfloop>
  </tr>
</cfoutput>
</table>

</body>



getQuery.cfm:

<cfsetting enablecfoutputonly="Yes">

<!--- dieses Script laeuft auf dem externen Server!!!--->

<CFIF CGI.REQUEST_METHOD eq "GET">
  <cfabort showerror="Aufruf nur per Post erlaubt!">
<cfelse>
  <!--- Parameter als Pflich definieren --->
  <cfparam name="FORM.wRequest" type="string">
</cfif>

<!--- Daten für Abfrage ermitteln --->
<cfwddx action="WDDX2CFML"
  input="#FORM.wRequest#"
  output="strRequest">

<!--- Abfrage ausführen --->
<cfquery name="qData"
  datasource="#strRequest.sDatasource#"
  username="#strRequest.sUsername#"
  password="#strRequest.sPassword#">
#PreserveSingleQuotes(strRequest.mSQL)#
</cfquery>

<!--- queryset in ein WDDX-Paket konvertieren --->
<cfwddx action="CFML2WDDX"
  input="#qData#"
  output="wQuery">

<!--- WDDX-Paket an den aufrufenden Server senden--->
<cfoutput>
#wQuery#
</cfoutput>

<cfsetting enablecfoutputonly="no">

Diese Methode birgt allerdings auch Sicherheitsrisiken, denn jeder der DSN und Logindaten kennst, kann die DB abfragen, aber auch manipulieren, denn es lassen sich nicht nur selects schicken :-).
Im Praktischen Einsatz sollten also noch zusätzliche Sicherheitsfeatures eingebaut werden.

Steffen Goldfuss steffen@goldfuss.de - 24.03.2001

Zurück


Das deutsche ColdFusion-Forum cfml.de ist das Portal für Einsteiger und Experten zum Thema ColdFusion und der ColdFusion Markup Language (CFML).

© 2017 Webdesign & Hosting: CHC ONLINE Kassel | SOLVA Content-Management-System CMS
Urlaub-Angebote.de - Urlaub mit Bestpreis-Garantie buchen