Registriert seit: 13. Feb 2005
Ort: Könnern/MD
107 Beiträge
Delphi 2006 Personal
|
Re: Komponente: MySQL via PHP-Tunnel
4. Apr 2007, 15: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
|