• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

Loginsystem mit PHP ???

  • Ersteller Applefan88
  • Erstellt am

Applefan88

Gast
Hallo Apfeltalker,
ich habe folgendes ??? Problem:
Ich habe ein Loginsystem mit PHP gebastelt was auf eine simple MySQL Datenbank zugreift.
Der Witz an der Sache unter zweien meiner Rechner funktioniert es wunderbar nur auf allen anderen nicht!
Da lädt er die Seite einfach neu.???
Hier der Code:

Code:
<?php
session_start();

if (isset($_POST['userid']) && isset($_POST['password'])) {
   
    $username = $_POST['userid'];
    $password = $_POST['password'];

    $db_conn = @new mysqli('localhost', 'root', '', 'rss');

    if (mysqli_connect_errno()) {
        echo 'Verbindungsaubau zur Datenbank fehlgeschlagen: ' . mysqli_connect_error();
        exit();
    }

    $query = 'select * from user '
     . "where user ='$username' "
     . " and pass= md5('$password')";


    $result = $db_conn->query($query);
    if ($result->num_rows > 0) {
       
        $_SESSION['valid_user'] = $userid;
        header("Location: rss-reader.php");
    }
    $db_conn->close();
}
else {

}
 ?>

<html>
<head>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<title>Anmeldung</title>
<link rel="stylesheet" type="text/css" href="Bilder/style.css" />
<link href="Bilder/favicon.ico" rel="shortcut icon">
<style type="text/css">
<!--
a:link{color:#CCFF99;}
-->
</style>
</head>

<body background="Bilder/btn2.gif">
<form method="post">
<p>
<table border="0" cellspacing="0" cellpadding="1" align="center">
<tr><td colspan="4"><center><img src="Bilder/newspaper.jpg"></center></td></tr>
<tr><td colspan="4">&nbsp;</td></tr>
<tr><td colspan="4" background="Bilder/site.gif" width="2"></td></tr>
<tr><td rowspan="8" background="Bilder/site.gif"></td></tr>
<tr><td colspan="2"><img src="Bilder/header.jpg" /></td>
<td rowspan="8" background="Bilder/site.gif"></tr>
<tr><td  bgcolor="#343434" height="15px" colspan="2"></td></tr>
<tr><td bgcolor="#343434"><font><b><center>Benutzername:</b></center></font></td>
<td><center><input type="text" name="userid" size="50" accesskey="u" /></center></td></tr>
<tr><td bgcolor="#343434"><font><b><center>Password:</center></b></font></td>
<td><center><input type="password" name="password" size="50" accesskey="p" /></center></td></tr>
<tr><td colspan="2" bgcolor="#343434"><center><input type="submit" value="Login" /></center></td></tr>
<tr><td colspan="2" background="Bilder/site.gif"></td></tr>
</table></p>


</body>

</html>
Wenn mir da einer weiterhelfen könnte wäre das super!
 

Waldgeist

Tokyo Rose
Registriert
13.10.06
Beiträge
69
Cookies aktiviert?
Er lädt einfach neu, heißt? Die gleiche Seite?
Oder die rss-reader.php (header("Location: rss-reader.php");) [oder ist das dei gleiche]?
Ein paar mehr Informationen wären noch gut.
Alles auf einem Rechner liegend und die anderen greifen darauf zu?

Meine erste Vermutung wäre, da du ja davon sprichst, dass er die Seite einfach neu lädt, dass er ohne die Sessions zu speichern weitergeleitet wird (auf rss-reader.php).
Das ganze kannst du wunderbar testen, indem du das header("Location ..."); auskommentierst und statdessen eine Ausgabe wie diese erzeugst:
echo "es kommt was!"; exit;
Wenn die Ausgabe kommt, weißt du, dass es an dem header liegt und somit vermutlich an der Session.

Grüße Jonas
 

Applefan88

Gast
also

das war die index.php Seite, wenn man die Daten abschickt, lädt er einfach die index.php neu.
Wenn die Logindaten falsch sind auch einfach immer, und ich weiß einfach nicht wo der Fehler ist??? :-c

wenn ich statt der Session einen echo befehlt einsetze, lädt er den eigentlich schon und zeigt den auch an
 

Applefan88

Gast
und auf einem anderen linux system habe ich das ganze auch getestet da funzt es auch nicht und noch nicht einmal die sql kommandos wie Insert oder so, die Felder bleiben in der datenbank einfach leer, der Rechner legt dann einfach leere Daten an? So einen Bullshit habe ich bis eben auch noch nicht gesehen. Auf den Windows Rechnern läuft es wunderbar aber auf Ubuntu oder Macintosh nada! Langsam bin ich mit den Nerven am Ende ;)
 

Waldgeist

Tokyo Rose
Registriert
13.10.06
Beiträge
69
Ein paar mehr Informationen wären trotzdem noch gut.
Alles auf einem Rechner liegend und die anderen greifen darauf zu?

Wir wissen also, dass die oben angegebene Datei die index.php ist.
Und wenn alles klappt, dann leitest du auf die rss-reader.php weiter...?
(Kann ja nicht anders sein, aber so ist es klarer.)

Nutzt du auf allen Rechnern den selben Browser?
F5 (neuladen) oder was auch immer das bei den Browsern ist ausprobiert?
Cache geleert?

Ich weiß nicht ob das eine Rolle spielen könnte, aber ich mache es immer:
<form action="index.php" method="post"> (oder wenn aktiviert auch $PHP_SELF)

Ein weiterer Fehler der gerne mal auftritt und den man wenn er auftritt ewig nicht merkt...
Richtige Datei? Oder vllt. in eine kopie gespeichert?
Prüf das am besten mit einer einfachen Ausgabe im vorhandenen loginscript:
Code:
<form method="post">
Hallo...
<p>

Soll noch etwas in den else Bereich rein?
 

Applefan88

Gast
Ja, es ist so:

Ich habe eine index.php Datei die oben zu sehen ist. Diese lag auf einem Windows XP Rechner, nun wollte ich die fertigen Scripte zu Strato hochladen. Aber dort stellte ich fest, dass mein Login Script (index.php) nicht weiterleitet auf meine rss-reader.php.
Also habe ich Stunden nach Fehlern gesucht aber keine gefunden.

Ich nutze Firefox neueste Version, und lade die Seiten immer neu. Und das mit der Kopie :-D ist leider auch nicht der Fehler.

Woran kann es liegen die Datenbank ist MySQL 5.0. irgendwas und der Rest ist PHP5.

Und wenn ich das Script wieder auf meinen Windows Rechner ziehe läuft es wieder wunderbar.
 

Applefan88

Gast
Oooohh

Ich habe folgendes gelöscht in der index.php oben session_start();
und dann hat er wenn ich statt header blabla einen Echo Wert eingegeben habe ausgegeben.
Aber mit Session_start(); funzt selbst das nicht!
 

Waldgeist

Tokyo Rose
Registriert
13.10.06
Beiträge
69
Also auf dem Strato Space läuft es nicht? Auch nicht von den Windows rechnern?
Oder habe ich das falsch verstanden?
Aber Local (auf dem Windows Rechner) geht es?
 

Applefan88

Gast
genau
er kann einfach die Session nicht erstellen, denn ich habe in der rss-reader.php eine if Schleife wenn die Session nicht true ist, wird er mit header location wieder auf index.php zurückgeleitet.
Wenn ich das mit einer anderen Fehlermeldung programmiere, dann zeigt er die an.

Aber warum kann er unter jeglicher Linux Art keine Sessions registrieren???
 

Applefan88

Gast
Jetzt Habe Ich Es!!! Juchuu

Also ich habe in der Index.php einfach bei der Sessionerstellung $_SESSION['valid_user'] == $userid; auf == TRUE umgeändert, jetzt läuft der Login wunderbar.
Aber trotzdem Vielen Dank!:-D
 

Waldgeist

Tokyo Rose
Registriert
13.10.06
Beiträge
69
kann er. Immerhin basieren fast alle Server auf Linux.
Aber ich hatte schon öfters Probleme mit Sessions.
Unter Windows allerdings.
Dann habe ich ein bisschen damit rumgespielt und dann ging es irgend wann.
Nach der Weiterleitung zufolge liegen die index und die rss... PHP-Datein im selben Ordner?

Mein Tipp wäre,
erstell eine neue Datei, z.B: test.php und füg den folgenden Code ein:
Code:
<?PHP
session_register();
echo session_id();
echo $_SESSION[test];
$_SESSION[test]="123";
?>
Die Datei lädst du auf den Server und lädst einfach mal die Seite neu.
 

Waldgeist

Tokyo Rose
Registriert
13.10.06
Beiträge
69
bestens :).
Aber wie gesagt (in dem Post hier drüber),
manchmal muss man einfach rumspielen.
Mit Sessions habe ich auch schon viel Zeit in den Wind gehängt.
 

Applefan88

Gast
Mittlerweile habe ich das größte Problem an der Sache gefunden, warum meine Scripte bei Linux nicht richtig laufen, denn dort muss ich ja den Apache2 verwenden, un der hat nun mal als Standart Register_Globals auf Off.
Ganz im Gegensatz zu den Xampp und lampp Angelegenheiten. ;)

Aber darauf muss man doch erstmal kommen.

Ich finde, da hätte man von Zend eine eigene Fehlermeldung einbauen können.
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Na ja, register_globals ist schon seit PHP4.1.irgendwas »von Hause« aus abgeschaltet. Man hat nämlich schnell einsehen müssen, dass man mit index.php?auth=1 bei 50 Prozent aller Anfängerseiten einbrechen konnte ;)

Für Deine Authentifizierung würde ich Dir folgenden Weg empfehlen (der ist dann unabhängig von PHP-Sessions, Cookies und enable_trans_sid):
Code:
/*
    $Id: auth.inc.php,v 1.3 2003/08/27 12:05:19 hendrik Exp $
*/
	function updateUser ($userID) {
	
		if ($GLOBALS ['connID']) {
		
			$sql		=	"UPDATE users ";
			$sql		.=	"SET last_access=NOW() ";
			$sql		.=	sprintf ("WHERE userID='%u' LIMIT 1", $userID);
			
			if ($res = mysql_query ($sql, $GLOBALS ['connID'])) {
				return TRUE;
			}
		}
		
		return FALSE;
	}
	
	function validateUser ($username, $pass) {
	
		if ($GLOBALS ['connID']) {
	
			$sql	=	"SELECT *, UNIX_TIMESTAMP(last_access) AS stamp_last_access ";
			$sql	.=	"FROM users ";
			$sql	.=	sprintf ("WHERE username='%s' ", strtolower (mysql_real_escape_string ($username)));
			$sql	.=	sprintf ("AND pass='%s' LIMIT 1", mysql_real_escape_string ($pass));
			
			if ($res = mysql_query ($sql, $GLOBALS ['connID'])) {
				if (mysql_num_rows ($res) > 0) {
					$_detail	=	mysql_fetch_assoc ($res);
					if ($_detail ['stamp_last_access'] < _TIME_OUT_) {
						if (updateUser ($_detail ['userID'])) {
							return TRUE;
						}
					}
				}
			}
		}
		
		return FALSE;
	}
		
	
	if (!validateUser ($_SERVER ['PHP_AUTH_USER'], $_SERVER ['PHP_AUTH_PW'])) {
	
		header ('WWW-Authenticate: Basic realm="DuKommstHierNichRein"');
		header ('HTTP/1.0 401 Unauthorized');
		echo "Bitte nennen Sie Benutzername und Passwort.";
		exit ();
	}

Zusatz: Die Konstante 'TIME_OUT' kann so definieret sein:
Code:
define ('_TIME_OUT_', time () + (15 * 60));

Damit fliegen die Leute nach einiger Zeit einfach raus.

Diese Datei speicherst Du unter dem Namen 'auth.inc.php' ab und bindest Die einfach als erstes nach der Verbindungsaufnahme zur Datenbank in Deine 'index.php' ein.

Voraussetzung ist, dass Du eine Tabelle für die erlaubten Benutzer hast. Diese Tabelle heißt im Beispiel 'users' und hat diese Struktur (für MySQL ab 4.1.12):
Code:
CREATE TABLE `users` (
  `userID` smallint(5) unsigned NOT NULL auto_increment,
  `username` varchar(24) NOT NULL default '',
  `pass` varchar(12) NOT NULL default '',
  `note` varchar(127) NOT NULL default '',
  `last_access` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`userID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Richtig sicher ist die Speicherung nicht, denn die Passwörter werden im Klartext gespeichert. Wenn's um Geld geht, müsstest Du die Passwörter einwegverschlüsseln und die Ergebnisse vergleichen.
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.060
Mittlerweile habe ich das größte Problem an der Sache gefunden, warum meine Scripte bei Linux nicht richtig laufen, denn dort muss ich ja den Apache2 verwenden, un der hat nun mal als Standart Register_Globals auf Off.

Es ist ein Skandal, daß es diese "Option" überhaupt noch gibt. Diese "Funktionalität" war und ist für sehr viele Einbrüche auf PHP Seiten veranwortlich. Ergo, auf gar keinen Fall verwenden.