Seite 1 von 1

skript mit login

Verfasst: Do 06.Apr, 2006 14:09
von bce
hallo.
wie bastel ich mir am besten ein login-skript in php?

folgendes problem: user loggt sich mit name und passwort ein... wenn das passwort richtig ist, soll eine seite kommen mit navi-verschiedenen möglichkeiten..

die einzelnen seiten sind schon fertig.. soll der user nun aber erst zu gesicht bekommen, wenn er erfolgreich eingeloggt ist...

wie realisiere ich so was am besten? session, cookie ... ?

thx

Verfasst: Do 06.Apr, 2006 15:56
von oxpus
wie realisiere ich so was am besten? session, cookie ... ?
Beides.
Die beste Vorlage bietet das phpBB selber, also in der durchlaufenden Reihenfolge
common.php
sessions.php (Feststellung User ist angemeldet oder Gast)
login.php
sessions.php (Nach An-/Abmeldung Session neu erstellen)

Im groben:
Zunächst wird die IP des Users ausgelesen und ein vorhandenes Cookie.
Ist das Cookie nicht da, wird schonmal grundsätzlich eine neue Session mit der IP erstellt.
Der User, der sich dann darauf anmeldet, bekommt eine dauerhaft eindeutige Session-ID, mit der er angemeldet bleibt.
Diese ID ist auch im phpBB zu finden und die kriptishe Nummer nach sid= in den einzelnen Links.
(Erzeugt mittels md5(); und irgendwelchen Werten).
Diese Daten werden dann sowohl in der Datenbank als auch im Cookie des Users abgespeichert, um bei der nächsten Seite den User wieder identifizieren zu können.
Im phpBB fiele damit z. B. das erneute Anmelden weg.

Aber auch PHP selber kann Sessions verwalten.
Schau dazu mal hier rein:
SetCookie - Die Cookieschreibung unter PHP
Sessions in PHP

Verfasst: Fr 05.Mai, 2006 14:44
von bce
session und cookie hab ich so gesetzt:

Code: Alles auswählen

	//session setzen
	$_SESSION["bce"] = $session_id;
	$_SESSION["username"] = $_POST["user"];
	
	//cookie setzen
	setcookie("bcespieler", "ok", time()+3600);  // verfällt in 1 Stunde
und die abfrage ob beides vorhanden ist, schaut so aus:

Code: Alles auswählen

if (isset($_SESSION["bce"]) && (isset($_COOKIE["bcespieler"]))) { 
	header("Location: main.php");
	exit;
}
aber irgendwas haut bei der cookie-prüfung nicht hin... ob cookie gesetzt ist oder nicht, ist wurscht.. warum das so ist... ¢¦

Verfasst: Fr 05.Mai, 2006 15:25
von oxpus
Hm, übernimm doch mal $_COOKIE['bcespieler'] in eine Variable und prüfe diese...

Verfasst: Sa 06.Mai, 2006 22:07
von bce
hab nun mal ein wenig probiert... aber zu einem richtigen ergebniss bin ich nich wirklich gekommen...

mit setcookie("bcespieler", "ok", time()+3600); erzeuge ich das cookie...
oder sollte ich lieber setcookie("bcespieler", true, time()+3600); anwenden?

wird das cookie mit setcookie("bcespieler", "ok", -1); überhaupt sofort gelöscht?
weil ich mich ja zum testen ca. im minutentakt einlogge...

Verfasst: So 07.Mai, 2006 02:05
von oxpus
Cookies ohne Zeitangabe werden gelöscht, wenn die Session abgelaugen ist oder der Browser geschlossen wird.
Also alles mit Zeit <= 0 wird so behandelt.

Verfasst: Mo 08.Mai, 2006 18:25
von bce
ok.. funktioniert nu soweit..

habe es so realisiert:

1. index.php

Code: Alles auswählen

//starten einer session
session_start();

if (!isset($_SESSION["ses"])) { 
	header("Location: login.php");
}
elseif ($_GET["action"] == "logout") {
	session_destroy(); //session löschen
	setcookie("spieler", false, -1); //cookie löschen
	header("Location: login.php");
}
else {
	header("Location: admin.php");
}
2. login.php

Code: Alles auswählen

$session_id = session_id();
session_start();

...
wenn username und passwort stimmen, dann:
	//session setzen
	$_SESSION["ses"] = $session_id;

	//cookie setzen
	setcookie("spieler", true, time()+3600);  // verfällt in 1 Stunde

	header("Location: main.php");
...
3. main.php
es wird überprüft ob die session und das cookie vorhanden ist...

Code: Alles auswählen

session_start();

if (!isset($_SESSION["ses"]) || (!isset($_COOKIE["spieler"]))) {
	header("Location: login.php");
}

if ($_GET["action"] == "logout") {
	session_destroy(); //session löschen
	setcookie("spieler", false, -1); //cookie löschen
	header("Location: login.php");
}

html-file erzeugen
   
funktioniert soweit prima..

kann man was verbessern oder ist irgendwas doch nicht richtig sicher?

Verfasst: Mo 08.Mai, 2006 18:43
von oxpus
Ist erstmal okay soweit.
Sofern Du keine Datenbank verwendest, um die IP nicht loggen, ist das nach meinem Dafürhalten erstmal okay.
Teste weiter, ob man hier nun diverse Einbruchsversuche starten kann, z. B. mit einem manuell geänderten Cookie...

Verfasst: Do 11.Mai, 2006 16:00
von bce
ok.. nutze nun auch zum einloggen die db..

Code: Alles auswählen

if ((strlen($_POST['user']) > 0) && (strlen($_POST['userpass']) > 0)) {     

	include("../functions.php");
	
	//Verbindung zur DB herstellen
	connectSQL();
	
	$sql = 'SELECT * FROM spieler_cfg WHERE name="' .$_POST['user']. '" and pw="' .md5($_POST['userpass']) . '"';

	$result = @mysql_query($sql);
	if (!$result) {
	    die('Ungültige Abfrage: ' . mysql_error());
	}
	//bei treffer zugang zum admin-bereich		
	elseif (mysql_num_rows($result) != 0) {
	
		//session setzen
		$_SESSION["sid"] = $session_id;
		$_SESSION["username"] = $_POST["user"];
	
		//cookie setzen
		setcookie("spieler", true, time()+3600);  // verfällt in 1 Stunde
	
		header("Location: main.php");
	}//if mysql
	
}//if strlen > 0
wie kann ich die ip mitloggen und prüfen?

Verfasst: Do 11.Mai, 2006 16:58
von oxpus
Die User-ID steht in $HTTP_SERVER_VARS['REMOTE_ADDR'] zur Verfügung. Die ist (sofern nicht gefakt) eindeutig und kann auch im Cookie, bzw. zur Kontrolle in der Datenbank abgelegt werden.
Wenn sich dann ein User anmeldet, wäre diese IP auch prüfbar, allerdings darf man sich nicht darauf verlassen, denn die IP kann jederzeit wechseln.
Allerdings innerhalb der Session muss diese gleich sein, somit hat man wenigstens die Session sicher.
Ansonsten muss sich der User eben anmelden und die Daten müssen mit der DB übereinstimmen...

Verfasst: Fr 12.Mai, 2006 19:38
von Gichtus
niemals vom Benutzer gesendete Daten (z.B. $_POST oder $_GET) direkt an ein SQL-Statement übergeben. Schon gar nicht an einer Stelle, an die jeder rankommt. In der functions.php von phpBB gibt es eine schöne Funktion dafür (phpbb_clean_username() oder so)
Der Standalone-CrackerTracker von cback sollte auch irgendwo drin sein, am Besten per require() ;)

Verfasst: Do 18.Mai, 2006 17:13
von Sonic2007
2 Fragen dazu:
1. Was bedeutet strlen?
2. was macht denn require()?

Verfasst: Do 18.Mai, 2006 17:21
von oxpus
1. strlen = String Length = Länge der Zeichenkette
2. require = http://www.oxpus.de/viewtopic.php?t=5057

Verfasst: Fr 19.Mai, 2006 18:16
von Sonic2007
gut. Hab ich schon nachgelesen ;)