PHP Login via Session aus Datenbank

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
565
Hallo,

ich habe da mal wieder ein Problem.
Bislang habe ich meinen Code einfach so geschrieben um ihn testen zu können. Nun möchte ich meinen Bereich jedoch durch einen Login schützen.

Also dachte ich an eine Session mit Abfrage aus der Datenbank. Der erste Login funktioniert auch soweit ganz gut, sobald ich aber meine eine Seite weiter klicke ist die Session wieder weg ... ähm, ich poste einfach mal den Code:
PHP:
if(isset($_POST['username']))
		{
			$username = $_POST["username"];
			#$username = "admin";
			#$passwort = md5($_POST["password"]);
			$passwort = $_POST["passwort"];
			#$passwort = "admin";
			
			$db_sel = mysql_select_db( MYSQL_DATENBANK ) or die("Auswahl der Datenbank ".MYSQL_DATENBANK." fehlgeschlagen");
			
			$abfrage = "SELECT name, passwort FROM $USERS WHERE name LIKE '$username' LIMIT 1";
			$ergebnis = mysql_query($abfrage);
			$row = mysql_fetch_object($ergebnis);
			
			if($row->passwort == $passwort) {
				$_SESSION["username"] = $username;
				
				(siehe code aus part 2)
			
			} else {
				 echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>";
			}
			
		} else {
			   include PATH_TPL . "/tpl.login.vm";
		   exit;
		}

Login sieht wie folgt aus:
PHP:
<form action="new_file.php" method="post">
Dein Username:<br>
<input type="text" size="24" maxlength="50"
name="username"><br><br>

Dein Passwort:<br>
<input type="password" size="24" maxlength="50"
name="passwort"><br>

Passwort wiederholen:<br>
<input type="password" size="24" maxlength="50"
name="passwort2"><br>

<input type="submit" value="Abschicken">
</form>

Das eigentliche Problem ist nun meine verschachtelung innerhalb des positiven logins:

PHP:
	if(isset($_GET['action']))
	{
		$action = $_GET['action'];
		if ($action == "post") {

action post sollte eigentlich ein neues template anzeigen, anstelle dessen wird mir aber die login seite angezeigt ...
 
Du musst die Session ganz am Anfang der Seite einmal starten ansonst funktioniert sie nicht. Ganz wichtig, es muss ganz oben stehen, ansonsten gibts Fehler. Die Seite wird der sicher weiterhelfen können.

http://www.php-einfach.de/php-tutorial/php-sessions.php

In der jetzigen Form ist deine Session eine normale Variable, die natürlich sofort vergessen ist sobald die Seite neu aufgerufen wurde.
 
So oder so muss die Session aber beim Browser mit geschleppt werden, da jeder neue Request an den Server ohne Kennung die Session nicht wieder herstellt. Ganz einfach über einen GET Parameter, oder üblicherweise über einen Cookie.
 
Ahja und darauf achten das keine BOM Zeichen in deiner Datei sind, die könnten Probleme machen.
 
@all: danke ... ich habe gestern selber gemerkt dass die schleife ja absoluter murks ist ... es kann natürlich beim zweiten mal nicht mehr funktionieren, da $_POST Username leer ist ...

inzwischen hab ich es umgeschrieben und es funktioniert wieder!

Blo0DLusT schrieb:
Ahja und darauf achten das keine BOM Zeichen in deiner Datei sind, die könnten Probleme machen.

danke ... ich hab zwar grad gegooglet, finde jetzt aber keine konkreten hinweiße. was genau meinst du damit?
den code schreibe ich mit aptanastudio 3 (eclipse php port) auf mac os x lion. eigentlich dürfte doch kein utf-8 problem auftauchen?
 
PHP:
if($row->passwort == $passwort) {
				$_SESSION["username"] = $username;

Mal noch ne kleine Seitenfrage dazu: Speicherst du die Passwörter etwa im Klartext? Nix gut...
 
ist im moment nur zum localem testen. sobald es in den live-betrieb überwandert wird per md5 verschlüsselt.
 
Zum BOM: PHP < 6 hat Probleme mit PHP Source Files die einen BOM haben, wenn der PHP nicht speziell mit der Zend Multibyte Erweiterung gebaut wurde. Der BOM wird dann an Apache übertragen und als HTML ausgegeben, was zum einen unschöne Zeichen in der Seite verursacht und zum anderen es verhindert dass man den HTML Header setzen kann (PHP Funktion header). Eine Datei welche zwar UTF-8 Zeichen aber keinen BOM enthält, macht hingegen keine Probleme. Es muss halt in PHP der richtige Zeichensatz eingestellt sein, da die automatische Erkennung von Ansi und UTF-8 nicht zwingend funktioniert.

P.S. Sichere Passwörter hasht man besser mit SHA und macht event. noch einen Salt dazu, die Rainbowtables für MD5 sind mittlerweile recht groß geworden.
 
vielen dank, wobei bei php.net gelesen habe, dass davon abgeraten wird, anstelle dessen dann lieber crypt.
wobei ich sagen muss, dass es sich hier um ein login für 1-10 user handelt, also die datenbank wird an userübergröße nicht sterben.

zum thema BOM muss ich leider nochmal nachfragen, den so ganz verstehe ich es nicht. es stimmt, wenn ich php header benutzen möchte, bekomme ich die fehlermeldung "Warning: Cannot modify header information - headers already sent..."

allerdings weiß ich nicht genau, was ich jetzt dagegen tuen muss? aptana studio 3 zeigt die berechtigungen der datei als utf-8 an, auch ist im preferences utf-8 im workspace eingestellt.

Als PHP Version Lokal habe ich die 5.3.1.

Ist es nur ein Problem welches ich durch die IDE beheben kann? Leider zeigt mit Google zu Aptana Studio 3 + BOM nichts hilfreiches an :-(
Ergänzung ()

nachtrag: aber habe ich wirklich ein BOM effekt?

benjamins-imac:ALPHA benji$ head index.php
<?php

/**
*
*/

session_start();

define("MAINDIR", dirname(__FILE__) . '/');

sieht eigentlich gut aus oder ?

und die tpl "head"

benjamins-imac:stage benji$ head tpl.head.vm
<!DOCTYPE html>
<html lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="Content-Language" content="de" />

<title><?=APP?> - <?=$version?>_<?=$patchlevel?></title>
Ergänzung ()

okay, folgender nachtrag nr 2:

es gibt hier eine anleitung, ob diese ganz richtig ist, weiß ich nicht.

https://www.starmind.com/de/question/17550/UTF-8-BOM-in-Textfile-mit-PHP-erkennen

Die Lösung via
Datei bom.php (abgespeichert UTF-8 mit Bom)

<?php
echo 'bom';

Datei test.php

<?php
$datei = file_get_contents('bom.php');
echo '=>' . $datei . '<=';

Ausgabe der test.php: =>

habe ich probiert. ein "=>" erhalte ich jedoch nicht.
also kein BOM effekt?

frage: wieso kann ich dann kein header (Location ...) nutzen?
Ergänzung ()

nachtrag 3:

folgendes funktioniert dann doch mit
PHP:
ob_start();

...

ob_end_flush();
aber ob das so richtig ist?
 
Die Meldung besagt ja erst mal nur, dass du bereits HTML ausgegeben hast "BEVOR" du die Funktion header() benutzt. Wenn PHP jedoch auf Output Buffering konfiguriert, ist das nicht schlimm wenn du das in PHP machst. Denn dann wird nicht direkt einfach eine Ausgabe an Apache geschickt, sondern erst nachdem alles abgearbeitet wurde. Sauber ist es trotzdem, das in der richtigen Reihenfolge zu machen, schon alleine aus Kompatibilitätsgründen.

Deine Dateien dürfen zwar UTF-8 Zeichen enthalten, aber eben nicht als "echtes" UTF-8 also mit BOM gespeichert werden.

Grundsätzlich würde ich auch nicht UTF-8 und Ansi mischen, daher PHP gibt in UTF-8 aus, dein HTML Code ist aber Ansi und im HTML Header ist dann auch noch Ansi gesetzt. Es wird dann garantiert dazu führen, wenn du direkt aus PHP etwas mit Umlauten ausgibst, dass diese dann auf deiner Webseite defekt sind.
 
Blackbenji schrieb:
Das ist keine Lösung sondern ein Test.
Lade die mal eine ordentliche Entwicklungsumgebung wie Notepad++ herunter. Im Menü Kodierung siehst du dann, dass die Datei als UFT-8 (mit BOM) abgespeichert wurde. Du kannst die Datei dann mit ohne BOM speichern, aber sobald du die wieder in Aptana änderst wird die BOM wohl wieder drin sein...
 
da ich mit mac os x arbeite, ist notepad++ keine alternative für mich.

ich habe aber nachlesen können, bestätigt von einem support mitarbeiter (https://aptanastudio.tenderapp.com/discussions/problems/1900-encoding-utf-8-with-bom) , das aptana studio 3 ohne BOM speichert.

das problem, warum ich kein HEADER nutzen kann, hat Rache Klos richtig beschrieben, ich schreibe vor HEADER bereits HTML code.

was hilft ist das benutzen von

ob_start();

...

ob_end_flush();

(ob das jedoch vollkommen richtig ist, ist meine noch einzig offene frage)

gruß, blackbenji
 
Zurück
Oben