Delphi-PRAXiS
Seite 6 von 9   « Erste     456 78     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Komponente: MySQL via PHP-Tunnel (https://www.delphipraxis.net/54644-komponente-mysql-via-php-tunnel.html)

CG2003 4. Apr 2007 08:42

Re: Komponente: MySQL via PHP-Tunnel
 
Ich wollte gerne wissen, ob an den "Tunnel-Komponenten" noch gearbeitet wird?!

Rociel 4. Apr 2007 09:56

Re: Komponente: MySQL via PHP-Tunnel
 
anscheinend nicht, hab mir inzwischen selber n tunnel geschrieben

CG2003 4. Apr 2007 10:03

Re: Komponente: MySQL via PHP-Tunnel
 
Zitat:

Zitat von Rociel
anscheinend nicht, hab mir inzwischen selber n tunnel geschrieben

Magst Du den vielleicht veröffentlichen, oder ist der eher closed-source?

Rociel 4. Apr 2007 10:18

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.

Ghostwalker 4. Apr 2007 12:57

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. :)

supermuckl 4. Apr 2007 13:13

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

wfoertsch 4. Apr 2007 13:52

Re: Komponente: MySQL via PHP-Tunnel
 
Zitat:

Zitat von supermuckl
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

Hi,

also das wäre mir sogar nen Hunni wert :-D


Gruss

Rociel 4. Apr 2007 14:09

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:
<?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";
    
    
   }


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

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:
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;
nun die proc, die die ausgabe in ein Array of Array of String ausgiebt

Delphi-Quellcode:
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;
so und nun ein Beispiel zum aufrufen und die Variablen
Delphi-Quellcode:
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;
so hoffe das is verständlich, wenn nicht einfach fragen

supermuckl 4. Apr 2007 15:00

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.

Rociel 4. Apr 2007 15:08

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 21:10 Uhr.
Seite 6 von 9   « Erste     456 78     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz