![]() |
Re: Komponente: MySQL via PHP-Tunnel
Ich wollte gerne wissen, ob an den "Tunnel-Komponenten" noch gearbeitet wird?!
|
Re: Komponente: MySQL via PHP-Tunnel
anscheinend nicht, hab mir inzwischen selber n tunnel geschrieben
|
Re: Komponente: MySQL via PHP-Tunnel
Zitat:
|
Re: Komponente: MySQL via PHP-Tunnel
ja, weiß nicht, ob der dir was bringt, es geht bei dem lediglich um ne foreneinbindung, d.h. erst überprüfen ob der user existiert, und wenn ja, dann wird das md5(db-Passwort+irgendeinstring) übergeben um missbrauch zuvermeiden, und dann werden lediglich die geforderten werte über var_dump ausgegeben und im Prog in ein array gespeichert, also lediglich ein grundgerüst.
Mit dem auflisten im Prog bin ich noch nicht weiter weil ich noch keine erfahrung mit listboxes mit headern hab, und mom nicht die muse hab dran weiterzuarbeiten =) also wenn noch interesse bestehen sollte, kann ich heut nachmittag dann mal den nötigen quellcode vom tunnel und vom prog reinstelln, muss jetzt erstmal zum essen und dann einkaufen. |
Re: Komponente: MySQL via PHP-Tunnel
Also..interresse auf alle Fälle.
Mir schweben schon seit längerem Ideen durch den Kopf, die sowas sehr gut gebrauchen könnten. Insbesondere hinsichtlich Boards und/oder CMS-Systemen. Gibts ja wie Sand am Meer und die meisten Server haben PHP/MySQL zur Verfügung. Wenn man also ne Anbindung an sowas machen möchte, braucht man i.d.R. so einen Tunnel. :) |
Re: Komponente: MySQL via PHP-Tunnel
mal ne doofe frage/idee
wieso schreibt man nicht einen mysql server emulator, der als lokaler dienst z.b. auf dem gleichen rechner läuft wie der normale mysql client, der auf den server zugreifen will, der dann alle anfragen über das php script dann weiterleitet? also ungefär so: mysql server -> tcp/ip oder socks -> php / phpscript -> HTTP PROTOCOL / Internet -> mysql-server-emu -> tcp/ip -> mysql client anwendung dann müsste man evtl nur alle anfragen weiterleiten und wieder zurück und alles halbtransparent tunneln was so abläuft dann kann man nämlich alle "normalen" mysql client librarys, direct connect quellen, datasource zeugs und andere sachen verwenden und muss da garnichts an der endanwendung/frontend ändern |
Re: Komponente: MySQL via PHP-Tunnel
Zitat:
also das wäre mir sogar nen Hunni wert :-D Gruss |
Re: Komponente: MySQL via PHP-Tunnel
@supermuckl sowas ist schon nicht schlecht.
aber 1. weiß ich nicht wie man dann den MySQL server emuliert und 2. ist das prog dann für meine Leute gedacht, also würdes vllt. im Internet irgendwo schwirren, und mit dem tunnel den ich schreib, sind nur spezielle abfragen möglich die der dann ausgiebt, man hat also später dann nich auf die gesammte db zugriff wodurch es ein bisschen sicherer ist. So hier die tunnel.php
Code:
die $pass abfrage ist zur Prüfung, ob sich der User eingeloggt hat, analog einfach bei case "abfrage" $dbpasswd nutzen wenn dies nicht gewünscht ist
<?php
include "LA/phpBB2/config.php"; $link = mysql_connect($dbhost,$dbuser,$dbpasswd) or die('DB_FAIL1'); mysql_select_db($dbname) or die('DB_FAIL2'); $aktion = $_POST['aktion']; $user = $_POST['user_name']; $pass = $_POST['user_passwort']; $db_pass = $_POST['db_pass']; $abfrage = $_POST['abfrage']; if ($db_pass == md5($dbpasswd."irgendeinstring")) {$db_pass = $dbpasswd;} switch ($aktion) { case "login": $sql = "SELECT COUNT(*) as Anzahl FROM phpbb_users WHERE username= 'Rociel'/* eigentlich $user */ AND user_password= '".md5($pass)."' AND user_id > 0"; // echo $sql."\n"; $result = mysql_query($sql) OR die('DB_FAIL3'); $row = mysql_fetch_assoc($result); if($row['Anzahl']) { echo md5($dbpasswd."irgendeinstring")."\n"; echo "U_VALID"; mysql_close($link); } else die('U_NOTVALID'); break 1; case "abfrage": if ($abfrage != "") { mysql_connect($dbhost,$dbuser,$db_pass) or die('DB_FAIL1'); mysql_select_db($dbname) or die('DB_FAIL2'); $sql = $abfrage; $result = mysql_query($sql) OR die('DB_FAIL3'); while ($row = mysql_fetch_assoc($result)) {var_dump($row);} } else echo "Kein Query gefunden"; } ?> folgende func aufrufen um zu posten, ausgabe ist der im tunnel ausgebene wert: hier das md5 nicht falsch verstehn, hatte vor das passwort als md5 zu senden, hab aber noch nix passendes gefunden
Delphi-Quellcode:
nun die proc, die die ausgabe in ein Array of Array of String ausgiebt
function TForm1.post(aktion,user:string;md5:PCHAR;abfrage:string=''):string;
var Strings: TStringList; //Zusammengesetze Post-Daten Stream:TStringStream;//Ausgabe der Aufgerufenen Seite ausgabe:String; //Ausgabe der aufgerufenen Seite als String zeile:String; //Zum zeilenweisen Ausgeben der Rückgabe der Aufgerufenen Seite benutzte Zwischenvariable begin Stream:=TStringStream.Create('');//Rückgabe-Stream erstellen Strings := TStringList.Create; //Post-Daten-StringList erstellen try Strings.Add('aktion='+aktion); Strings.Add('user_name='+user); //Post-Daten in die StringList eintragen Strings.Add('user_passwort='+md5); Strings.Add('db_pass='+PASSWORT); Strings.Add('abfrage='+abfrage); try http.Post('http://www.meine.seite/tunnel.php', Strings,stream);//Datei abrufen //URL noch einstellen! ausgabe:=Stream.DataString; //Ausbage-Sring die zurückgegebenen Daten zuweisen zeile:=''; //Zwischenvariable leeren except //Fehlerbehandlung on E: Exception do showmessage('Error encountered during POST: ' + E.Message); end; finally ResponseMemo.Text := ausgabe; Strings.Free; Stream.Free; zeile := ResponseMemo.Lines.Strings[ResponseMemo.Lines.Count-1]; if zeile = 'DB_FAIL1' then error := DB_FAIL1 else if zeile = 'DB_FAIL2' then error := DB_FAIL2 else if zeile = 'DB_FAIL3' then error := DB_FAIL3 else if zeile = 'U_VALID' then begin error := U_VALID; ONLINE:=true; PASSWORT := ResponseMemo.Lines.Strings[ResponseMemo.Lines.Count-2]; end else if zeile = 'U_NOTVALID' then error := U_NOTVALID else result := ResponseMemo.Text; case error of DB_FAIL1 : ListBox1.Items.Add('Verbindung zu sql fehlgeschlagen'); DB_FAIL2 : ListBox1.Items.Add('Verbindung zur db fehlgeschlagen'); DB_FAIL3 : ListBox1.Items.Add('Query konnte nicht ausgeführt werden'); U_VALID : ListBox1.Items.Add('Login OK.'); U_NOTVALID : ListBox1.Items.Add('Login nicht OK.'); end; error := NO; // if ResponseMemo.Lines.Strings[ResponseMemo.Lines.Count-1] = 'DB_FAIL' then result :='DB_FAIL'; end; end;
Delphi-Quellcode:
so und nun ein Beispiel zum aufrufen und die Variablen
procedure TForm1.löse(res:string;lv:TListView);
function getArrayLength(res:string):integer; //Bestimme die Arraygröße des ersten var i,j:integer; //Inhaltes begin i := 1; j := 0; repeat if res[i]='[' then inc(j); inc(i); until res[i-1] = '}'; result:=j; end; procedure settabletop(res:string); var n,o,anfang,ende,quote1,quote2,quote4,z_quotes_tt:integer; tbltop:string; begin anfang := 0; ende := 0; n:=1; repeat if res[n]='{' then anfang := n; if res[n]='}' then ende := n; inc(n); until res[n-1]='}'; tbltop := Copy(res,anfang+1,ende-anfang-1); for n := 0 to v_results - 1 do begin o:=1; z_quotes_tt:=0; quote1:=0; quote2:=0; quote4:=0; repeat if tbltop[o]='"' then begin inc(z_quotes_tt); if z_quotes_tt = 1 then quote1 := o; if z_quotes_tt = 2 then quote2 := o; if z_quotes_tt = 4 then quote4 := o; end; inc(o); until z_quotes_tt = 4; tabletop[n]:=Copy(tbltop,quote1+1,quote2-quote1-1); tbltop := Copy(tbltop,quote4+1,length(tbltop)-quote4-1); end; end; procedure seperateonce(var res:string; var data:Array of string); procedure seperatetwice(var dataset:string); var l,m,z_quotes,quote3,quote4:integer; begin for l := 0 to v_results - 1 do begin m:=1; z_quotes:=0; quote3:=0; quote4:=0; repeat if dataset[m]='"' then begin inc(z_quotes); if z_quotes = 3 then quote3 := m; if z_quotes = 4 then quote4 := m; end; inc(m); until z_quotes = 4; data[l]:=Copy(dataset,quote3+1,quote4-quote3-1); dataset := Copy(dataset,quote4+1,length(dataset)-quote4-1); end; end; var k,anfang,ende:integer; //Teile die einzelnen Daten auf zur dataset:string; //Inhaltsbestimmung begin anfang := 0; ende := 0; k:=1; repeat if res[k]='{' then anfang := k; if res[k]='}' then ende := k; inc(k); until res[k-1]='}'; dataset := Copy(res,anfang+1,ende-anfang-1); seperatetwice(dataset); res := Copy(res,ende+1,length(res)-ende-1); end; var i:longint; begin v_results := 0; for i := 1 to length(res) do begin if res[i] = '{' then inc(v_results); end; v_arraylength := getArraylength(res); setlength(results,v_results); setlength(tabletop,v_results); settabletop(res); for i := 0 to v_results - 1 do begin setlength(results[i],v_arraylength); seperateonce(res,results[i]); end; end;
Delphi-Quellcode:
so hoffe das is verständlich, wenn nicht einfach fragen
type
Terror = (NO,DB_FAIL1,DB_FAIL2,DB_FAIL3,U_VALID,U_NOTVALID); . . . private PASSWORT:string[32]; var tabletop:Array of string; //enthält den Tabellenkopf tabletop[b] results:Array of Array of string; //results[0] -> erste eintrag, results[1] -> 2. ..., und results[a][b] vom a. eintrag der b. wert v_results,v_arraylength:integer; ONLINE:boolean; error:Terror = NO; Form1: TForm1; procedure TForm1.FormCreate(Sender: TObject); var sql:string; begin ONLINE := false; post('login','USERNAME','PASSWORD im KLARTEXT'); setTabs(ONLINE); sql := 'SELECT user_id,username FROM phpbb_users WHERE user_id < 3'; löse(post('abfrage','USERNAME','PASSWORD im KLARTEXT',sql),ListView1); end; |
Re: Komponente: MySQL via PHP-Tunnel
naja ich meine mal ein grundsätzliches projekt das alle einsatzgebiete breit abdeckt und auch sicher ist.
nicht auf ein spezielles projekt wie hier jetzt beschrieben wurde zugeschnitten - wie gesagt nur ein ideen entwurf meinerseits ich habe leider zu wenig zeit mich da ran zu hocken (auch weil ichs selbst eigentlich nicht brauche) aber einen server zu emulieren dürfte doch garnicht so schwer sein oder? man muss ja nur das protocol analysieren und schauen wie die anfragen und replys usw aussehen und das dann einfach durchs php weiterreichen ohne großartige interpretation der daten und speicherung und verwaltung der selbigen. beispiel einer anwendung, die jetzt mal ganz grob gesehen mit einem mysql server über php und emu kommunizieren würde: mysql client connected zu emu applikation über tcp/ip emu verwaltet diesen client nun temporär als session und nimmt query oder sonstiges ( login protocol von mysql usw) entgegen. dieses wird verschlüsselt und an das php script auf dem webserver geschickt, wo der ziel-mysqlserver liegt das phpscript connected über tcp/ip sockets zum mysql server und loggt sich ein bzw sendet das query im konformen mysql protocol der server antwortet und schickt das reply an das phpscript (das script wartet bis server die ergebnismenge zurück gibt usw) das phpscript verschlüsselt das und schickts wieder zurück an den richtigen client (session ist ja weiterhin aufgebaut) die client application bekommt die ereignismenge also im prinzip könnte man eigentlich den indy tcp tunnel umbauen, damit man damit rein über "strings versenden und empfangen" (die verschlüsselt sind) über php kommunizieren kann das phpscript muss natürlich dann das gegenstück des tunnels als tcp lösung sein. und schon ists sogar egal ob wir mysql oder was anderes da druchleiten - es kann alles auf tcp/ip basis sein :) das bringt mich zu der annahme das es schon so einen tcp/ip tunnel als phpscript ja schon geben könnte? man müsste das halt mit delphi verbinden können das das eine endstück delphi sein kann und das andere (kompatibel) php. :) habe jetzt alledings nicht die zeit da großartig zu suchen aber das wäre ein lösungsweg wo so ziemlich viel erschlagen würde, was an technischen problemen so auftreten können. |
Re: Komponente: MySQL via PHP-Tunnel
hmpf, dazu müsste man sich dann mit den protokollen auseinandersetzen, wofür ich keine zeit hab, da ich noch keine erfahrungen hab was programmieren mit protokollen angeht, hatte damals nur n chat angefangen der über die socks-kompos von delphi lief....
nuja, wie gesagt, ich hoffe der quellcode ist erstmal soweit hilfreich für euch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz