Einzelnen Beitrag anzeigen

Rociel

Registriert seit: 13. Feb 2005
Ort: Könnern/MD
107 Beiträge
 
Delphi 2006 Personal
 
#58

Re: Komponente: MySQL via PHP-Tunnel

  Alt 4. Apr 2007, 14:09
@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
  Mit Zitat antworten Zitat