PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] vbulletin login.php -> reine passwort prüfung einfügen


Gast
2009-02-20, 12:17:36
hi,
also erstmal: die frage mag viell. nooblike sein, dass liegt aber daran das ich absulot keinen plan von php habe! habe mich mit php noch nie beschäftigt...

ich will mit java (ja, hochsprachen kann ich^^) einen request an die login seite senden und prüfen ob der login erfolgreich war oder nicht.
wenn ich das auf login.php?do=login mache, bekomme ich immer als response die kompletten quelltext der start seite zurück, brauchen würde ich im idealfall nur true oder false, bzw. 0 oder 1.

die originale abhandlung sieht so aus:

// ############################### start do login ###############################
// this was a _REQUEST action but where do we all login via request?
if ($_POST['do'] == 'login')
{
$vbulletin->input->clean_array_gpc('p', array(
'vb_login_username' => TYPE_STR,
'vb_login_password' => TYPE_STR,
'vb_login_md5password' => TYPE_STR,
'vb_login_md5password_utf' => TYPE_STR,
'postvars' => TYPE_STR,
'cookieuser' => TYPE_BOOL,
'logintype' => TYPE_STR,
'cssprefs' => TYPE_STR,
));

// can the user login?
$strikes = verify_strike_status($vbulletin->GPC['vb_login_username']);

if ($vbulletin->GPC['vb_login_username'] == '')
{
eval(standard_error(fetch_error('badlogin', $vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'], $strikes)));
}

// make sure our user info stays as whoever we were (for example, we might be logged in via cookies already)
$original_userinfo = $vbulletin->userinfo;

if (!verify_authentication($vbulletin->GPC['vb_login_username'], $vbulletin->GPC['vb_login_password'], $vbulletin->GPC['vb_login_md5password'], $vbulletin->GPC['vb_login_md5password_utf'], $vbulletin->GPC['cookieuser'], true))
{
($hook = vBulletinHook::fetch_hook('login_failure')) ? eval($hook) : false;

// check password
exec_strike_user($vbulletin->userinfo['username']);

if ($vbulletin->GPC['logintype'] === 'cplogin' OR $vbulletin->GPC['logintype'] === 'modcplogin')
{
// log this error if attempting to access the control panel
require_once(DIR . '/includes/functions_log_error.php');
log_vbulletin_error($vbulletin->GPC['vb_login_username'], 'security');
}
$vbulletin->userinfo = $original_userinfo;

if ($vbulletin->options['usestrikesystem'])
{
eval(standard_error(fetch_error('badlogin_strikes', $vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'], $strikes)));
}
else
{
eval(standard_error(fetch_error('badlogin', $vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'])));
}
}

exec_unstrike_user($vbulletin->GPC['vb_login_username']);

// create new session
process_new_login($vbulletin->GPC['logintype'], $vbulletin->GPC['cookieuser'], $vbulletin->GPC['cssprefs']);

// do redirect
do_login_redirect();

}
else if ($_GET['do'] == 'login')
{
// add consistency with previous behavior
exec_header_redirect($vbulletin->options['forumhome'] . '.php');
}


meine logik sagt mir nun, dass ich das im grunde übernehmen könnte, nur das ich hinterher anstatt der umleitung einfach das ergebnis ausgebe... (laut google kann ich mit echo das ergebnis direkt schreiben)

z.b. so:

if ($_POST['do'] == 'pwCheck')
{
$vbulletin->input->clean_array_gpc('p', array(
'vb_login_username' => TYPE_STR,
'vb_login_password' => TYPE_STR,
'vb_login_md5password' => TYPE_STR,
'vb_login_md5password_utf' => TYPE_STR,
'postvars' => TYPE_STR,
'cookieuser' => TYPE_BOOL,
'logintype' => TYPE_STR,
'cssprefs' => TYPE_STR,
));

$result = false;

// can the user login?
$strikes = verify_strike_status($vbulletin->GPC['vb_login_username']);

if (!verify_authentication($vbulletin->GPC['vb_login_username'], $vbulletin->GPC['vb_login_password'], $vbulletin->GPC['vb_login_md5password'], $vbulletin->GPC['vb_login_md5password_utf'], $vbulletin->GPC['cookieuser'], true))
{
$result = true;

($hook = vBulletinHook::fetch_hook('login_failure')) ? eval($hook) : false;

// check password
exec_strike_user($vbulletin->userinfo['username']);

$vbulletin->userinfo = $original_userinfo;

if ($vbulletin->options['usestrikesystem'])
{
$result = false;

eval(standard_error(fetch_error('badlogin_strikes', $vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'], $strikes)));
}
else
{
eval(standard_error(fetch_error('badlogin', $vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'])));
}
}

exec_unstrike_user($vbulletin->GPC['vb_login_username']);

echo $result;

}



meine frage ist nun, ob das so funktionieren kann?
wie kann man das besser/richtig machen?


mfg

Berni
2009-02-20, 12:54:45
Wieso probierst dus nicht einfach aus? Generell siehts OK aus.
Ich persönlich würde aber halt einfach mit ner regular expression die originale Loginseite aus Java heraus prüfen...in der abgeänderten Form kann sich ja kein normaler User mehr richtig einloggen womit das Forum relativ zweckfrei ist.

Gast
2009-02-20, 13:16:25
hi,

testen werde ich es schon, wollte aber vorher fragen ob mans besser machen kann, also um gleich dem pfusch vorzubeugen :)

die originale login seite prüfen geht natürlich auch, allerdings habe ich da nur so nen blöden string "danke für ihre anmeldung", der sich auch noch abhängig von der sprache ändert... das ist dann übrigends plan B :D


die alte funktionalität sollte sich eigentlich net ändern, ich will da zusätzlich zum "if ($_POST['do'] == 'login')" block, einen weiteren mit "if ($_POST['do'] == 'pwCheck')" einfügen.
wenn ich die funktionsweise richtig verstanden habe, müsste ich das dann mit login.php?do=pwCheck aufrufen können...


mfg

Berni
2009-02-20, 15:25:13
Achso ok. Wobei ich mich schon frage was das überhaupt werden soll. Könntest du nicht einfach auch auf nem Datenbankdump operieren oder dich direkt auf den SQL-Server verbinden?

Gast
2009-02-20, 16:07:06
hi,
es soll ne anwendung an ein forum gekoppelt werden, d.h. benutzung ist nur nach regestrierung mit den login daten möglich.

warum es nun zu solch einem schritt kommt bzw. warum es nicht ausreicht schon den download des programms nur für regestrierte benutzer anzubieten, ist ne geschichte für sich....das lasse ich jetzt mal aus....

aber wie du wohl merkst, kommt deswegen nen dump nicht in frage und eine direkte sql abfrage würde die zugangsdaten im programm selbst erfordern, diese will ich aber nicht unbedingt dort ablegen.


mfg

Berni
2009-02-20, 16:59:37
Ok, dann wäre ein Direktzugriff auf die Datenbank tatsächlich Selbstmord ;) In dem Zusammenhang möchte ich aber darauf hinweisen, dass das Entfernen dieser Benutzerabfrage aus deinem Java-Programm (oder alternativ ohne Eingriff ins Programm: Umleitung auf eine eigene statische Seite, die immer einen erfolgreichen Login vorgaukelt) für einen etwas versierteren Nutzer absolut kein Problem darstellt.

Gast
2009-02-20, 17:11:20
joa, die probleme sind mir bekannt :/

code ist aber schon sicher, auch wenns java ist :)

beim redirect wirds aber wirklich problematisch.....ne idee :D?

Berni
2009-02-20, 17:26:00
Naja den Java-Code kann man einfach dekompilieren, die Überprüfung rausschmeißen und neu kompilieren. Insofern ist das eben gerade nicht sicher. Kannst du mal genauer erklären, was der Java-Client machen soll?

Gast
2009-02-20, 17:43:33
schau mal die animation auf dieser seite an:
http://www.zelix.com/klassmaster/

so sieht der code nach dem decompelieren aus :p dazu werden die klassen auch automatisch umbenannt und heißen dann A.class, B.class... und liegen dann auch alle im selben package.

Kannst du mal genauer erklären, was der Java-Client machen soll?
meinst du die prüfung?
er soll mit ner urlconnection ne verbindung zum server aufbauen und über post den namen und md5 passwort versenden.
und anhand des resultats (true oder 1) entscheiden ob nix passiert, oder ob z.b. mit System.exit() das programm beendet werden soll.

also habe mir da eignetlich noch net so recht gedanken gemacht, sollte erstmal den login testen wenn ich wieder @home bin^^

Berni
2009-02-20, 17:54:32
Naja das ist aber Security by Obscurity und zu bevorzugen wäre Security by Design zumal das Programm ja auch richtig Kohle kostet.

Leider hast du immer noch nicht gesagt was du genau machen willst aber mal angenommen du willst einen Java-Chat-Client machen mit dem man dann mit dem Forennamen chatten kann. In dem Fall wäre es z.B. sinnvoll, dass man beim sich Login (und in regelmäßigen Abständen von z.B. 15 Minuten erneuert) von einem PHP-Script eine SessionID abholt (relativ lang damit man keinen erraten kann) welche zusammen mit der IP in der SQL-Datenbank gespeichert wird. Der Chatserver überprüft dann bei jeder gesendeten Nachricht ob die SessionID gültig ist.