Seite 1 von 2

Logindaten im Link übergeben?

Verfasst: 28.05.2007 22:03
von krapi
Hallo,

ich versuche ohne große Umwege gleich zum Punkt und zu meinem Problem zu kommen. Ich habe eine große Datenbank mit Namen und Passwörtern und diese Daten möchte ich nun in einem Link übermitteln sodass sich die Nutzer nicht erst in meinem Forum registieren müssen sondern ihre bisherigen Daten verweden können.

Ist dies ohne weiteres möglich oder bedarf es einer großen Umstrukturierung der Login.php? Ich wäre über eure Tipps sehr dankbar. :)

Verfasst: 29.05.2007 00:27
von gn#36
Die Logindaten selbst im Link zu übergeben ist eine sehr unsichere Methode der Datenübertragung. Generell wäre es natürlich unter einem gewissen Aufwand schon möglich Login von Homepage und Forum zu kombinieren vermutlich ist aber die Übernahme des Forumsystems einfacher als der Umbau des Logins im Forum. Wenn du lediglich die Daten weiterverwenden willst sollte eine Portierung derselben (natürlich nach einer gewissen vermutlich unvermeidbaren Anpassung) in die Usertabelle des Forums einfacher sein. Dann wird der user beim Login auf der Homepage zwar nicht im Forum eingeloggt, aber kann zumindest die gleichen Anmeldeinformationen verwenden wie zuvor.
Hilfreicher Lesestoff: KB:72

Verfasst: 29.05.2007 14:24
von krapi
Danke für deine Antwort. :)

Ich weiß das es nicht so sicher ist aber mein Chef will es so, es soll funktional und für den Kunden einfach zu benutzen sein.

Ich bin ja nur auf der Suche nach einer Anleitung wie ich die login.php so umkonfigurieren kann, dass ich des passwort und benutzerdaten übergeben kann ohne mich jetzt lange in den Code einlesen zu müssen.

Also falls jemand Tipps oder eine Anleitung hat immer her damit ich bin über alles dankbar. ;)

Verfasst: 29.05.2007 14:58
von gn#36
Gut wenn du unbedingt möchtest...
Ich würde dir aber vorschlagen, zumindest statt Username und Passwort einen zufällig erstellten Hash zu übergeben, damit das ganze zumindest ein wenig sicherer wird (wenn sich der Hash bei jedem User auch bei jeder Verwendung ändert dann wäre das natürlich noch viel besser).

Unter der Vorraussetzung dass du das mit dem Hash machst würde ich das so machen:
0. Erst mal von allem eine Sicherungskopie machen.
1. Füge in der prefix_users Tabelle eine Spalte namens login_hash hinzu (varchar 32 Zeichen, Default irgendwas zufälliges damit keiner auf die Idee kommt sich mit einem leeren Hash anzumelden...)

2. Trage mit deinem Skript von dem aus du weiterleitest in diese Datenbankspalte einen zufälligen Hash ein (z.b. basierend auf Zeit und Usernamen), hänge den Hash mit an die URL dran (z.b. mit uid=HASH).
Die URL sähe jetzt beispielhaft so aus:
login.php?login=true&uid=HASH&u=USERID

3. Bearbeite die Login.php (ich bleibe jetzt mal bei dem Beispiel dass die Variable uid heißt).
Suche

Code: Alles auswählen

$username = isset($HTTP_POST_VARS['username']) ? phpbb_clean_username($HTTP_POST_VARS['username']) : '';
		$password = isset($HTTP_POST_VARS['password']) ? $HTTP_POST_VARS['password'] : '';
und füge danach ein:

Code: Alles auswählen

$hash = isset($HTTP_GET_VARS['uid'])? $HTTP_GET_VARS['uid'] : '';
$user_id = -1;
if($hash)
{
$user_id = isset($HTTP_GET_VARS['u']? $HTTP_GET_VARS['u'] : -1;
//hash sicher machen:
$hash = preg_replace("#[^0-9a-f]#is",'',$hash);
//User suchen:
$sql = "SELECT user_id, username, user_password, user_active, user_level, user_login_tries, user_last_login_try
			FROM " . USERS_TABLE . "
			WHERE login_hash='".addslashes($hash)."' AND user_id =".intval($user_id);
}
Dann diesen direkt darunter folgenden Code

Code: Alles auswählen

$sql = "SELECT user_id, username, user_password, user_active, user_level, user_login_tries, user_last_login_try
			FROM " . USERS_TABLE . "
			WHERE username = '" . str_replace("\\'", "''", $username) . "'";
ersetzen durch das hier:

Code: Alles auswählen

else
{
$sql = "SELECT user_id, username, user_password, user_active, user_level, user_login_tries, user_last_login_try
			FROM " . USERS_TABLE . "
			WHERE username = '" . str_replace("\\'", "''", $username) . "'";
}
Jetzt müssen wir noch die Passwortüberprüfung brücken:
Finde:

Code: Alles auswählen

if( md5($password) == $row['user_password'] && $row['user_active'] )
				{
ersetze durch

Code: Alles auswählen

if( (md5($password) == $row['user_password'] && $row['user_active']) || ($row['user_id'] == $user_id  && $hash && $row['user_active']))
				{
Wenn du wirklich die unsichere Variante der Übergabe per GET wählen willst dann brauchst du lediglich diese Stelle hier zu editieren:

Code: Alles auswählen

$username = isset($HTTP_POST_VARS['username']) ? phpbb_clean_username($HTTP_POST_VARS['username']) : '';
		$password = isset($HTTP_POST_VARS['password']) ? $HTTP_POST_VARS['password'] : '';
und da zum Beispiel

Code: Alles auswählen

$username = isset($HTTP_POST_VARS['username']) ? phpbb_clean_username($HTTP_POST_VARS['username']) : (isset($HTTP_GET_VARS['username']) ? phpbb_clean_username($HTTP_GET_VARS['username']) : '');
		$password = isset($HTTP_POST_VARS['password']) ? $HTTP_POST_VARS['password'] : (isset($HTTP_GET_VARS['password']) ? $HTTP_GET_VARS['password'] : '');
draus machen. Ich rate aber klar von dieser unsicheren Variante ab

Verfasst: 29.05.2007 15:09
von krapi
Hammer, danke für deine schnelle Antwort!
Ich werde es nach deiner Beschreibung ausprobieren! :grin:

Verfasst: 05.06.2007 09:30
von krapi
Ich hab jetzt alles ein paar Mal probiert und die login.php nach oben stehendem Muster zu modifizien. Dies ist mir auch insoweit gelunden, dass das Login noch funktionier ich aber nicht mittels einens Links einlogen kann.

Der Link sieht folgender Maßen aus

Code: Alles auswählen

<a href='https://www.********/phpbb/login.php?login=true&uid=dhvbjbh123&u=3'>weiterleiten</a>
Der Hash ist also erstmal noch statisch aus Testzwecken.

Den Teil, welchen ich in der login.php geändert habe sieht jetzt folgendermaßen aus

Code: Alles auswählen

//###############################################################
// Passwort Username 
$username = isset($HTTP_POST_VARS['username']) ? phpbb_clean_username($HTTP_POST_VARS['username']) : (isset($HTTP_GET_VARS['username']) ? phpbb_clean_username($HTTP_GET_VARS['username']) : ''); 
$password = isset($HTTP_POST_VARS['password']) ? $HTTP_POST_VARS['password'] : (isset($HTTP_GET_VARS['password']) ? $HTTP_GET_VARS['password'] : '');


//###############################################################
// Neu Login & Hash Überprüfung
$hash = isset($HTTP_GET_VARS['uid']) ? $HTTP_GET_VARS['uid'] : ''; 
$user_id = -1; 
if($hash) 
{ 
  $user_id = isset($HTTP_GET_VARS['u']) ? $HTTP_GET_VARS['u'] : -1; 
  //hash sicher machen: 
  $hash = preg_replace("#[^0-9a-f]#is",'',$hash); 
  //User suchen: 
  $sql = "SELECT user_id, username, user_password, user_active, user_level, user_login_tries, user_last_login_try 
           FROM " . USERS_TABLE . " 
           WHERE login_hash='".addslashes($hash)."' AND user_id =".intval($user_id); 
}
else {

$sql = "SELECT user_id, username, user_password, user_active, user_level, user_login_tries, user_last_login_try
	FROM " . USERS_TABLE . "
	WHERE username = '" . str_replace("\\'", "''", $username) . "'";
}
// Ende Login & Hash Überprüfung
//#################################################################

[..]

if( (md5($password) == $row['user_password'] && $row['user_active']) || ($row['user_id'] == $user_id  && $hash && $row['user_active'])) 
Ich habe mitlerweile so lange rumprobiert das ich nun keine Ahnung mehr habe woran es noch liegen könnte.
Über Hinweise oder neue Tipps würde ich mich freuen.

Verfasst: 05.06.2007 18:23
von gn#36
Ich vermute dass es daran liegt, dass der Hash nicht-zulässige Zeichen enthält. Wenn du dir diese Stelle in meinem Code ansiehst:

Code: Alles auswählen

//hash sicher machen:
  $hash = preg_replace("#[^0-9a-f]#is",'',$hash);
kann man erkennen, dass nur die Ziffern 0-9 und die Buchstaben a-f erlaubt sind (das entspricht z.b. einer HEX Zahl die herauskäme wenn du den Wert beispielsweise mit md5 generierst). Du kannst jetzt wenn du willst natürlich aus dem a-f ein a-z machen (dann sind alle buchstaben, aber keine Sonderzeichen oder Umlaute erlaubt), oder aber du änderst den Hash ab. Ich versuche normalerweise den erlaubten Bereich immer so weit einzuengen wie möglich, aber es dürften sich eigentlich keine zusätzlichen Sicherheitsprobleme ergeben, wenn du a-z erlaubst.
Derzeit wird der Hash von der oben dargestellten Zeile Code gefiltert und ist dann beim Vergleich natürlich nicht mehr gleich dem Inhalt der Datenbank. Wenn alles mit dem Statischen Hash funktioniert denke unbedingt daran, diesen bei jeder Verwendung gegen einen anderen zu tauschen da die Übergabe per GET unsicherer ist als die per POST (z.b. landen die Daten über GET auch in den Server Logs).

Verfasst: 07.06.2007 09:01
von krapi
Vielen dank, du hast mir wirklich sehr geholfen. :)

Es lag tatsächlich an dem falschen Hash.
Ich werde den Random Hash für jeden Benutzer verweden.

Verfasst: 12.06.2007 16:18
von krapi
Hallo,

ich muss noch einmal eine Frage stellen bezüglich des Logins über GET.
Soweit klappt alles, ich erstelle einen Zufalls-Hash schreibe den in die Datenbank, lesen den dann wieder aus und erstelle mir so den Link mit welchem ich auf die login.php linke.

Dies sieht dann vollgendermaßen aus

Code: Alles auswählen

https://www.*******/phpbb/login.php?login=true&uid=facaebacec&u=001967
Nun habe ich das Problem, dass ich mich genau einmal über diesen Link einloggen kann. Nach schließen des Fensters und erneutem Aufruf des Links gibt es zwar keinen Fehler, wie bspw. 'Benutzer & Passwort' nicht gefunden, aber der Login wird trotzdem nicht richtig vollzogen d.h. ich kann keine Beiträge verfassen und werde zum einlogen aufgefordert.

Nun meine Vermutung, dass das mit der SessionID zusammenhängt. Ich habe nachgelesen und soviel wie ich verstanden habe, wird die SessionID zusätzlich in einem Cookie gespeichert also muss ich noch den Cookie modifizieren das der Login klappt?!
Oder muss ich ganz einfach nur den Link um die Variable sid erweitern?

Update
Ich habe dies eben ausprobiert, mir eine eigene $sid mittels

Code: Alles auswählen

$sid = md5(uniqid(mt_rand(), true));
erstellt und dann den link vollgendermaßen angepasst

Code: Alles auswählen

https://www.*******/phpbb/login.php?login=true&uid=dbfbecbade&u=001967&sid=7e48a57135d2110dd343d0b9ad17faa9 
allerdings funktioniert, dies leider auch nicht. :(
Hmm wo könnte der Fehler liegen?

Verfasst: 12.06.2007 22:47
von gn#36
Wenn der Cookie gesetzt wird, dann bleibt er üblicherweise bis zum Schließen des Browserfensters gültig, bei einem neuen Browserfenster sollte er also keinen Einfluss mehr haben.
Einfach irgendeine SID anzuhängen funktioniert natürlich nicht, wenn eine Session existiert dann ist dieser natürlich eine spezielle ID zugeordnet.

Was passiert denn statt einer Fehlermeldung? Wirst du auf die index.php weitergeleitet?