PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Login Script funktioniert nicht richtig



Mac_Hack
17.09.2010, 11:41
Hallo Jungs,

Ich habe Probleme mit einem Login Script.
Das Script sollte überprüft, ob man eingeloggt ist und ruft dann die benötigten user-daten ab.
Jedoch Funktioniert das einloggen nicht richtig bzw gar nicht.
Könnte sich jemand von euch das Script unter die Lupe nehmen und mir bitte helfen?
Vielen Dank!


Hier die Paste...
Newroots Nopaste (http://paste.newroots.de/index.php/view/9ebf311a)

Hier der Code...


// User Login/Logout überprüfen und Daten, Rechte abrufen
$user_module = null;
if ((int)$_GET['logout'] == "1")
{
$safe = mysql_query("DELETE FROM __safe WHERE cid='".$_COOKIE[md5('fb_cid')]."' OR sid='".$_SESSION['fb_sid']."' LIMIT 1");
$safe = mysql_query("SELECT id FROM __safe WHERE cid='".$_COOKIE[md5('fb_cid')]."' OR sid='".$_SESSION['fb_sid']."' LIMIT 1");
$sql = mysql_query("UPDATE __user SET _safe='' WHERE _safe='".$sql['id']."' LIMIT 1");
unset($_COOKIE[md5('fb_cid')]);
unset($_SESSION['fb_sid']);
session_destroy();
if ($sql && $safe)
$user_module = 'Erfolgreich ausgeloggt';
}

if (isset($_COOKIE[md5('fb_cid')]) || isset($_SESSION['fb_cid']))
{
$cid = $_COOKIE[md5('fb_cid')];
$sid = $_SESSION['fb_sid'];
$safe = mysql_query("SELECT id FROM __safe WHERE cid='".$cid."' OR sid='".$sid."'");
$sql_safe = mysql_fetch_assoc($safe);
$log = mysql_query("SELECT id, name, pw, _safe FROM __user WHERE _safe = '".$sql_safe['id']."' LIMIT 1");
$user = mysql_fetch_assoc($log);
$rows = mysql_num_rows($log);
if ($log && $user && $rows) $logged = true;
} else if ($_POST['user'] != "" && $_POST['pw'] != "")
{
$name = mysql_real_escape_string($_POST['user']);
$pw = sha1($name.':'.md5($_POST['pw']));
$log = mysql_query("SELECT id, name, pw, _safe FROM __user WHERE name = '".$name."' AND pw = '".$pw."' LIMIT 1");
$user = mysql_fetch_assoc($log);
$rows = mysql_num_rows($log);
if ($log && $user && $rows) $logged = true;
}
if ( $logged == true && !isset($_GET['logout']))
{
$cid = null;
for ($x = 0; $x < 15; $x++)
{
$cid .= rand(0,25);
if ($x == 8)
$sid = md5($rnd);
}
$cid = md5($rnd);

$time = mysql_query("UPDATE __user SET time='".time()."' WHERE id='".$user['id']."'");

$_SESSION['fb_sid'] = $sid;
$sid = mysql_query("UPDATE __safe SET sid='".$sid."' WHERE id='".$user['_safe']."'");

if ((int)$_POST['remind'] == 1)
{
setcookie(md5("cid"),$rnd,time()+(3600*24*7));
$cid = mysql_query("UPDATE __safe SET cid='".$rnd."' WHERE id='".$user['_safe']."'");
}

$recht = mysql_fetch_assoc(mysql_query("SELECT * FROM __recht WHERE id='".$user['rid']."'"));

if (isset($_POST['user']) && isset($_POST['pw']))
$user_module = 'Erfolgreich eingeloggt';

$user_module .= "Hallo ".$user['name'];
if ($recht['view_admincenter'] == "1")
$user_module .= '<ul id="nav"><li><a href="?p=admin">Admin-Bereich</a></li></ul>';
}
else
{
$user_module .=
'<form action="#" method="post" id="login">
<input type="text" name="user" id="user" value="Name" onfocus="if (this.value == \'Name\') { this.value = \'\'; this.style.fontStyle = \'normal\'; }" onblur="if (this.value == \'\') { this.value=\'Name\'; this.style.fontStyle = \'italic\'; }" />
<input type="text" name="pw" id="pw" value="Pass" onfocus="if (this.value == \'Pass\' && this.type == \'text\') { this.value = \'\'; this.type = \'password\'; this.style.fontStyle = \'normal\'; }" onblur="if (this.value == \'\' && this.type == \'password\') { this.value = \'Pass\'; this.type = \'text\'; this.style.fontStyle = \'italic\'; }" />
<input type="submit" id="submit" value="" />
<p>
Angemeldet bleiben?
<input type="checkbox" name="remind" id="remind" value="1" />
</p>
</form>';
}



kann mir niemand weiter helfen? :-(

blackberry
17.09.2010, 13:02
Wie wärs mal mit einem SQL-Dump, damit wir wenigstens die Tabellen und ein paar Werte zum Testen hätten?

EDIT:

Jedoch Funktioniert das einloggen nicht richtig bzw gar nicht.
Was soll das bitte heißen? WAS funktioniert nicht? Nachdem ich die __user Tabelle erstellt und Daten eigefügt hatte, sowie
$recht = mysql_fetch_assoc(mysql_query("SELECT * FROM __recht WHERE id='".$user['rid']."'"));
auskommentiert hatte (weil mir wie gesagt die richtige Tabellenstruktur fehlt und ich keine Lust hatte groß rumzuraten -.-), konnte ich mich erfolgreich einloggen.

Skript:
http://pastie.org/1164764

SQL Dump:
http://pastie.org/1164765
Das Passwort für die User blackberry und root ist jeweils "password".

Mac_Hack
17.09.2010, 13:21
Hier die Tabellenstruktur von _user
Hilft das weiter?


SET FOREIGN_KEY_CHECKShttp://free-hack.com/aolbart:/1024/id/304B6F6C6F626F6B53657435/3D2D4F;
-- ----------------------------
-- Table structure for `__user`
-- ----------------------------
DROP TABLE IF EXISTS `__user`;
CREATE TABLE `__user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`pw` varchar(100) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`regdate` int(11) DEFAULT NULL,
`modified` int(11) DEFAULT NULL,
`time` int(11) DEFAULT NULL,
`_safe` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

blackberry
17.09.2010, 13:25
Ein bisschen... die von __safe wäre sicher auch nicht verkehrt.
Ansonsten bleibt die Frage, was denn angeblich nicht funktioniert, da ich mich ja erfolgreich einloggen konnte...

Mac_Hack
17.09.2010, 13:32
Ansonsten bleibt die Frage, was denn angeblich nicht funktioniert, da ich mich ja erfolgreich einloggen konnte...



SET FOREIGN_KEY_CHECKShttp://free-hack.com/aolbart:/1024/id/304B6F6C6F626F6B53657435/3D2D4F;
-- ----------------------------
-- Table structure for `__safe`
-- ----------------------------
DROP TABLE IF EXISTS `__safe`;
CREATE TABLE `__safe` (
`id` varchar(50) NOT NULL DEFAULT '',
`sid` varchar(50) NOT NULL DEFAULT '',
`cid` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`,`sid`,`cid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;





Ansonsten bleibt die Frage, was denn angeblich nicht funktioniert, da ich mich ja erfolgreich einloggen konnte...

und eben das ist das Problem, ich weiß nicht woran es liegt, aber wenn es funktionieren würde dann würde sich die Ausgabe ja ändern, was aber nicht passiert?

blackberry
17.09.2010, 13:37
Dran gedacht die $user_module auszugeben?

Mac_Hack
17.09.2010, 13:41
ja sicher^^
bei nicht erfolgreichem einloggen zeigt er ja wieder das formular

blackberry
17.09.2010, 13:59
$recht = mysql_fetch_assoc(mysql_query("SELECT * FROM __recht WHERE id='".$user['rid']."'"));
rid durch id ersetzen, damit der Adminbereich funktioniert.

Aktueller SQL-Dump:
http://pastie.org/1164833
(die __recht-Tabelle musste ich dann doch erraten... wenn da mehr als view_admincenter drin sein soll, dann natürlich das ersetzen - für den Teil vom Skript ist es allerdings irrelevant)

Aktueller Skript-Source:
http://pastie.org/1164834

Mac_Hack
17.09.2010, 14:09
ok danke, das habe ich übersehen
funktioniert aber immer noch nicht
aber hab jetzt mal durch zahlen usw geschaut wo der fehler wahrscheinlich ist


$log = mysql_query("SELECT id, name, pw, _safe FROM __user WHERE name = '".$name."' AND pw = '".$pw."' LIMIT 1") or die(mysql_error());
$user = mysql_fetch_assoc($log);

der fetch funktioniert nicht, da hat er abgebrochen, dabei hat der query keinen fehler ausgegeben.
???

EDIT/*
ja da kommt mehr als view_admincenter rein
werd die halt dann erweitern für was auch immer ich dann brauch

blackberry
17.09.2010, 14:14
Ganz blöde Frage: hast du überhaupt eine DB Verbindung? Was sagt mysql_error()?

P.S.: das eingeloggt bleiben erscheint mir schwachsinnig (zumindest so, wie es programmiert ist). Beispielsweise wird $rnd nirgendwo initialisiert...

Mac_Hack
17.09.2010, 16:22
ja hab ne db verbindung weil z.B navigation angezeigt wird (die auch von db abgerufen wird)
mysql_error() sagt nix
wenn du ne bessere idee hast dann immer her damit, hab nix dagegen was neues zu lernen oder auszuprobieren http://free-hack.com/aolbart:/1024/id/304B6F6C6F626F6B53657435/3B2D29

blackberry
18.09.2010, 07:53
$log = mysql_query("SELECT id, name, pw, _safe FROM __user WHERE name = '".$name."' AND pw = '".$pw."' LIMIT 1") or die(mysql_error());
$user = mysql_fetch_assoc($log) or die(mysql_error());
Die Ausgabe bitte posten.

Mac_Hack
18.09.2010, 15:28
meinst du die ausgabe vom mysql_error()?
weil die ist leer, wie bereits gesagt
oder meinst du ne andere ausgabe?

blackberry
18.09.2010, 15:53
$user = mysql_fetch_assoc($log) or die(mysql_error()); <-- ist neu
Gib mir doch einfach JEDE Fehlermeldung, die du bekommst, weil ich das sonst überhaupt nicht nachvollziehen kann.

Mac_Hack
18.09.2010, 16:25
es kommt keine fehlermeldung aber es passiert auch nichts
wenn ich ne fehlermeldung seh, dann kann ich die auch selber auflösen
immerhin sollte man schon fehlermeldungen verstehen (oder zumindest googlen xD) können

blackberry
18.09.2010, 17:39
Dann versieh das Skript doch einfach mal mit "echo __LINE__;"-s und schau dir an wo es abbricht.
Wenn du keine Fehlermeldung bekommst, $user_module am Ende ausgibst und wir wirklich das selbe Skript benutzen, dann kann ich dir auch nicht helfen - weil bei mir funktioniert es.

Mac_Hack
18.09.2010, 18:03
http://paste.newroots.de/index.php/view/82903478 (http://paste.newroots.de/index.php/view/82903478)
erstmal das was ich jetz hab
dann: bei mir funktioniert einloggen jetzt, aber neues problem...
ich bleibe nicht eingeloggt, sondern muss mich jedes mal neu einloggen

blackberry
18.09.2010, 18:19
Sicherstellen, dass $rnd vor Zeile 41 initialisiert worden ist und sicherstellen, dass du in __safe einen Eintrag für deinen User hinterlegt hast (da die Cookie-ID nur geUPDATEt wird und das, wenn noch kein Eintrag für die Cookie-ID von einem User vorhanden ist, fehlschlägt).

Anmerkung am Rande: du benutzt einige Variablen in Querys, ohne diese entsprechend mit mysql_real_escape_string zu sichern. Dies betrifft z.B. $_COOKIE[md5('fb_cid')]

Mac_Hack
18.09.2010, 18:29
$rnd war tippfehler und ist in neuem code berichtigt,
jep hab ich sonst gäbs bei der anmeldung auch schon probleme
ah, da hab ichs vergessen, thx dafür
ich glaub die session bzw der cookie werden nicht angelegt bzw der if der abfragen soll ob sie angelegt sind funktioniert nicht richtig
kann das jmd vl nachgucken, weil ich find da nix?

blackberry
18.09.2010, 19:00
Diff-Ausgabe:
http://pastie.org/1166892

(Die Zeilenangaben stimmen nicht 100%ig überein, da ich noch zusätzlich Code hinzufügen musste, damit das Skript überhaupt lokal bei mir läuft... den habe ich dann halt bei deiner Version auch eingefügt, damit der nicht noch in der Diff-Ausgabe auftaucht)

EDIT:
< setcookie(md5("cid"),$cid,time()+(3600*24*7));
---
> setcookie(md5("fb_cid"),$rnd,time()+(3600*24*7));
Müsste
< setcookie(md5("cid"),$cid,time()+(3600*24*7));
---
> setcookie(md5("fb_cid"),$cid,time()+(3600*24*7));

heißen

Mac_Hack
19.09.2010, 12:36
ich will ja das man entscheiden kann ob der cookie gesetzt wird deswegen kann ich kein && im if benutzen dadurch entfällt auch das AND im query
und wofür soll das $rnd = rand(1,9999) sein, soll das die schleife ersetzen?
ja bei der $time hab ich die klammer falsch gesetzt und bei dem letzten tippfehler
hab auch noch paar tippfehler berichtigt (sid und cid verwechselt)
$log = mysql_query("SELECT id, name, pw, _safe FROM __user WHERE _safe = '".$sql_safe['id']."' LIMIT 1") or die(mysql_error());
jetz bricht er hier ab:
$user = mysql_fetch_assoc($log) or die(mysql_error());

kalachnikov
19.09.2010, 15:08
das $rnd generiert dir eine zufällige Zahl zwischen 1 und 9999.

Mac_Hack
19.09.2010, 15:22
ja das is mir auch klar^^ nur warum er das ersetzen möchte interessiert mich^^

blackberry
19.09.2010, 15:24
Weil $rnd bei mir sonst undefiniert wäre und es später in $cid = md5($rnd); benutzt wird...

Mac_Hack
19.09.2010, 15:56
Okay, ud wieso bricht das jetzt immer da oben ab?

kalachnikov
21.09.2010, 13:32
bist du dir sicher, dass du dies selbst geschrieben hast? Wenn ja solltest du wahrscheinlich wissen, was du da zusammenfabriziert hast.