 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
05.12.2002, 23:15
|
#1
|
|
TP-Member
Registriert seit: Jan 2002
|
Wie macht man am besten eine User-Anmeldung?
Hallo,
ich habe ein Clanwar-Script geschrieben, allerdings ist meine Lösung zur Anmeldung der Members nicht die optimale; es funktioniert öfter nicht.
Das Script besteht aus einem Adminbereich für alle Einstellungen (User anlegen etc.) und dem eigentlichen "Warplaner". Es hat ein Hauptscript von dem man noch zwei andere aufrufen kann.
Man muss sich eigentlich nur anmelden, wenn man sich für einen War eintragen will oder die Admins etwas eintragen/löschen/posten wollen.
Die Anmeldung findet über einen Button "Login" statt, der linkt (category=login) zu einem Teil im Hauptscript, der das Login durchführt. Es wird eine eindeutige UIN erzeugt und bei dem jeweiligen User in der DB gespeichert. Ausserdem sollte man die Möglichkeit haben ein Cookie zu speichern, damit man sich nicht jedesmal wieder neu anmelden muss.
Die UIN ist der Schlüssel zum User und wir bei jedem Link mit übergeben, nur funktioniert das manchmal nicht richtig, weil die UIN auch abläuft und der die dann nicht verlängert oder erneuert.
Wenn ich dann vom Hauptscript aus ein anderes aufrufe, übernimmt der die UIN ab und zu nicht.
Das mit dem Cookie funktioniert auch nícht wirklich.
Ich steige da noch nicht so ganz durch.
Wo packt man das mit dem Login am besten hin?
Und wie regelt man das mit der UIN und den Cookies?
Wäre echt super, wenn mir jemand helfen könnte.
Danke!
Scooter
|
|
|
05.12.2002, 23:18
|
#2
|
|
TP-Veteran
Registriert seit: Nov 2002
Ort: bei Stuttgart (Esslingen)
|
kurze zwischenfrage...wo hostest du das script ?
soweit ich mal mitbekommen hab is bei puretec keine Headerübertgabe möglich (aber nicht sicha)
|
|
|
05.12.2002, 23:26
|
#3
|
|
TP-Member
Registriert seit: Jan 2002
|
Bei Host-Europe...
|
|
|
06.12.2002, 00:24
|
#4
|
|
TP-Specialist
Registriert seit: Mar 2001
Ort: NDS
|
So mach ich das:
Session wird gestartet.
LogIn werden Name und Passwort abgefragt und in die Session übergeben.
Auf jeder Seite wird jetzt ein abgleich zwischen Datenbank und Sessiondaten gemacht. Ist dieser Positiv, wird die Seite erstellt. Bei einem Fehler kommt "Verboten".
Da die Session so lange da bleibt, wie der Browser offen ist, hat der Admin auf jeder Seite seine Rechte und auch, wenn er wiederkommt.
Gleiches sollte mit einem Cookie gehen, da die Session ja nichts anderes macht als einen Cookie zu setzen.
Beispiel: http://www.bushidoalfeld.de/index.php?page=910
__________________
the0bone
Wissen ist Macht, nichts Wissen macht nichts!
|
|
|
06.12.2002, 01:07
|
#5
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
Sprich - bei jedem Seitenaufruf machst Du einen Datenbankzugiff? Wozu? Es reicht doch völlig, nach einem erfolgreichen Check z.B. ein $login=true in die Session zu schreiben. Dann checkt man auf jeder zur sichernden Seite, ob in der Session die Variable $login existiert.
Die Session kann man weder fälschen, noch ein anderes Mal nutzen, sobald das Browserfenster zugemacht wird. 
__________________
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
|
|
|
06.12.2002, 01:17
|
#6
|
|
TP-Newbie
Registriert seit: Aug 2001
Ort: Ahrensburg
|
Zitat:
Original geschrieben von Adagio
... $login=true in die Session zu schreiben. Dann checkt man auf jeder zur sichernden Seite, ob in der Session die Variable $login existiert.
Die Session kann man weder fälschen, noch ein anderes Mal nutzen, sobald das Browserfenster zugemacht wird.
|
hmm, also ich würde meinen, dass ich mit
/dieseite.php?login=true
das system sofort ausgehebelt hätte
aber ich lerne gern dazu  wie würdest du das absichern? ich bin bisher bei meinen projekten auch immer den weg gegangen, jeden seitenaufruf neu zu prüfen
mfg
__________________
[A. Einstein]
"Man hat den Eindruck, daß die moderne Physik auf Annahmen beruht, die irgendwie dem Lächeln einer Katze gleichen, die gar nicht da ist."
|
|
|
06.12.2002, 10:49
|
#7
|
|
TP-Member
Registriert seit: Jan 2002
|
Hört sich sehr gut an!
Aber wie funktioniert das mit der Session?
Gruß
Scooter
|
|
|
06.12.2002, 15:17
|
#8
|
|
TP-Veteran
Registriert seit: Jan 2002
|
Zitat:
hmm, also ich würde meinen, dass ich mit
/dieseite.php?login=true
das system sofort ausgehebelt hätte
|
Das stimmt nur unter folgenden zwei Bedingungen, nämlich
a) dass die Überprüfung von $login im 'Haupt-Scope' (nennt man das so?), also 'direkt im Script' und nicht in einer Funktion stattfindet und
b) register_globals aktiviert ist und das Script nicht explizit die Superglobals $_GET, $_POST usw. verwendet.
register_globals ist zwar (noch) bei allen(?) Hostern aktiviert, dennoch sollte man für neue Scripts besagte Superglobals verwenden, weil man damit eben genau diese Sicherheitslücke schließt.
Ich selbst löse die Session-Weitergabe das Zustands 'eingeloggt' bei meinem aktuellen Projekt allerdings auch, indem ich Benutzername und Passwort 'merke' und bei jeder Anfrage den Abgleich durchführe.
Der Grund ist schlicht, dass ich im Script nicht nur wissen will, ob der Benutzer eingeloggt ist, sondern auch um wen es sich handelt, mit allen Detailinformationen - insbesondere denen, die für die Rechteerteilung benötigt werden. Folglich muss ich den Datensatz so oder so bei jedem Aufruf holen.
Okay, natürlich könnte ich einfach alle User-Daten in der Session speichern, und dagegen hab ich auch garkein wirklich rationales Argument - so isses mir einfach lieber  .
|
|
|
06.12.2002, 18:41
|
#9
|
|
TP-Specialist
Registriert seit: Mar 2001
Ort: NDS
|
Zitat:
Original geschrieben von Adagio
Sprich - bei jedem Seitenaufruf machst Du einen Datenbankzugiff?
|
Brauche ich ja sowieso!
Jede Seite bekommt wichtige Informationen aus der Datenbank. Somit ist die Verbindung ja schon offen und ich brauche nur auf eine andere Tabelle zugreifen.
__________________
the0bone
Wissen ist Macht, nichts Wissen macht nichts!
|
|
|
06.12.2002, 18:51
|
#10
|
|
TP-Veteran
Registriert seit: Jan 2002
|
Stimmt, das wollte ich eigentlich auchnoch sagen - ich hab bei mir pro Aufruf etwa 20 - 40 Queries (in einem Testsystem, das praktisch noch leer von wirklichen Inhalten ist, d.h. es werden später locker noch einige dazukommen). Jedenfalls macht da ein Query mehr oder weniger nicht viel aus.
|
|
|
06.12.2002, 20:33
|
#11
|
|
TP-Veteran
Registriert seit: Dec 2002
Ort: london
|
1. kann man deine systemaushebelung leicht umgehen, indem man nicht einfach die variable $login abfragt, was sowieso nur mit registor_globals = OFF geht, sondern das einfach mit $:SESSION['login'] macht.
zu euren query massen: also ich versuche immer die querys zu minimieren. ab einer gewissen anzahl bremst es die seite aus. ich weiß ja nicht, was du - seb - für seiten machst, aber ich denke mit einer guten scriptplanung kann man doch auf eine kleinere zahl´kommen.
um nochmal aufs sessionmanagement zurückzukommen:
es geht wirklich am einfachsten und vor allem effizientesten biem login alle daten abzufragen, die es über den user zu wissen gibt. bei mir stehen die alle in einem array namens $user[], welches ich am anfang jeder page via $user[] = $_SESSION['user'] abhole. damit habe ich alle user-relevanten daten immer zur hand und gut verpackt.
|
|
|
06.12.2002, 23:54
|
#12
|
|
TP-Member
Registriert seit: Jan 2002
|
Hmm...
Ich konnte dem ganzen nicht so ganz folgen, da ich noch überhaupt nichts mit Sessions zu tun hatte.
Verstehe ich das soweit richtig?
<?php
...hier ist mein Formular der Loginseite...
...Name und Passwort wird eingegeben...
if ( $user == "xyz" && $passwd == "irgendwas" )
{
session_start();
$var = "login";
session_register("$var");
...hier steht der Link...
}
else{
...tue nichts...
}
...auf der nächsten Seite wird abgefragt...
if ($HTTP_SESSION_VARS["var"]== "login" )
{
...hier geht's weiter...
}
else{
...es geht nicht...
}
Ich muss aber bei jedem weitern Link die SessionID mit
sid=".$PHPSESSID."
übergeben?
Und solange das Fenster nicht geschlossen wird ist man angemeldet?
Ich brauche dann aber noch mehrere Infos zu den User aus der DB, und ganz wichtig eine UIN, die gesetzt wird, wenn man sich anmeldet und abgelaufen ist, wenn man das Fenster schließt.
Wie mache ich das?
Kann man die Anmeldung auch mit einem Cookie machen das bleibt, damit man sich nicht dauernd anmelden muss?
Vielen Dank!
Scooter
|
|
|
07.12.2002, 00:24
|
#13
|
|
TP-Veteran
Registriert seit: Jan 2002
|
Zitat:
|
zu euren query massen: also ich versuche immer die querys zu minimieren. ab einer gewissen anzahl bremst es die seite aus. ich weiß ja nicht, was du - seb - für seiten machst, aber ich denke mit einer guten scriptplanung kann man doch auf eine kleinere zahl´kommen.
|
Ich wusste, dass irgendjemand was dazu sagen würde
Die Sache is die - Dieses Script ist kein 'herkömmliches' Guestbook oder Forum oder sonstwas, das auf einen einzigen Verwendungszweck hin konzipiert und angepasst ist. Es soll vielmehr etwas sein, was man garnicht so einfach erklärn kann - im Grunde ein 'Application Framework', falls dir der Ausdruck was sagt.
Das bedeutet, dass es eigentlich nichts tut, ausser eine Basisumgebung bereitzustellen, auf die die eigentlichen Anwendungen wie News, Forum usw. aufgesetzt werden. Deren Programmierung ist entsprechend einfach und vergleichsweise schnell zu erledigen, da der Großteil des erforderlichen Codes ja bereits vorhanden ist. Zudem lassen sich die einzelnen Module sehr gut miteinander verknüpfen und verschmelzen....hm, ich seh, ich müsst hier sehr ins Detail gehen, um die Idee dahinter und das Funktionspinzip zu erklärn - dabei wollt ich eigentlich nur was zu den vielen Queries sagen:
Ich bin sicher, dass sich das noch an einigen Stellen optimieren lässt, bin aber genauso davon überzeugt, dass der aktuelle Zustand durchaus schon recht effektiv ist. Zwischen den Phasen, in denen ich irgendwelche neue Funktionalität dazuprogrammier, geh ich immer wieder den Code durch und such nach Stellen, die optimiert werden können. In letzter Zeit find ich immer weniger - mein Programmierwissen ist dabei mittlerweile ausgereizt, das System läuft für meine Erwartungen ausreichend schnell und stabil und der Kern ist so gut wie fertig.
Die vielen Queries ergeben sich einfach aus dem Arbeitsprinzip dieses Scripts - ich wüsste nicht, wie ich das noch verbessern könnte. Aber wie gesagt, um das genauer zu erklären, müsste ich weit ausholen.
|
|
|
07.12.2002, 00:40
|
#14
|
|
TP-Specialist
Registriert seit: Mar 2001
Ort: NDS
|
Zitat:
Original geschrieben von scooter
... eine Menge Code...
|
Hi!
Ich stelle dir hier mal ein paar Codes aus meiner Seite zur Verfügung!
session wird immer ganz oben gestartet:
PHP-Code:
session_name("deine session");
session_start();
dann wird die Datenbank connectiert um Daten für die Seite auszulesen
PHP-Code:
@mysql_pconnect...
Auf der LogIn Seite kommt dann:
PHP-Code:
if(!isset($thisname)&&!isset($thispass)||$thisname!=$admin_name && $thispass != $admin_pass) {
print "<h3>Bitte einloggen!</h3>
<form action=\"login.php\" method=\"get\">
<p>LogIn Name:</p><input type=\"text\" name=\"thisname\"><br>
<p>Passwort:</p><input type=\"password\" name=\"thispass\"><br><br>
<input type=\"submit\" value=\"LogIn\" name=\"button\">
<input type=\"reset\" value=\"Clear\"></form>";}
elseif($thisname == $admin_name && $thispass == $admin_pass){
session_register("thisname");
session_register("thispass");
print "<p>Admin eingeloggt!</p>";}
auf deutsch  :
Die Daten admin_name und admin_pass werden aus der datenbank oder einer configFile geladen. Wenn der Admin nicht oder falsch eingeloggt ist, kommt das Form. Beim drücken von Senden bleibt man auf der Seite und die Seite wertet sich selbst aus.
Falls der versendete Adminname und das Adminpasswort stimmen, werden diese Werte in der Sesion gespeichert und dem User dieses angezeigt.
Aus jeder Folgeseite mit Zugriffsschutz kommt dieser Code:
PHP-Code:
if(!isset($thisname)&&!isset($thispass)||$thisname!=$admin_name && $thispass != $admin_pass) {
print "Sie haben keine Berechtigung diese Seite zu betreten!";
} elseif($thisname == $admin_name && $thispass == $admin_pass){ echo "Geheime Seite!";}
translate: Falls die Variablen thisname und thispass gar nicht gesetzt sind, kommt gleich ein Fehler. Dann müssen die beiden Vars auch noch mit den Werten der DB übereinstimmen, sonst wieder die Fehlermeldung.
Erst wenn beide mit der Werten der DB übereinstimmen, kommst du auf die Geheime Seite.
__________________
the0bone
Wissen ist Macht, nichts Wissen macht nichts!
|
|
|
07.12.2002, 00:47
|
#15
|
|
TP-Specialist
Registriert seit: Mar 2001
Ort: NDS
|
Zitat:
Original geschrieben von scooter
Ich muss aber bei jedem weitern Link die SessionID mit
sid=".$PHPSESSID."
übergeben?
|
Nö! Beim Erzeugen einer Session sendet PHP automatisch einen Cookie an den Browser, welcher die SID enthält. Im Normalfall wird dieser gelöscht, wenn der Browser beendet wird.
Gefahr droht hier nur, wenn der User keine Cookies annimmt.
PHP kann man jedoch mit einer Option kompilieren, dass es automatisch alle Links und Formulare mit der SID erweitert... da sollte evtl. mal einer der Server Spezies was zu sagen  "-enable-trans-sid"
Um sicher zu gehen, kannst du dieses natürlich auch von Hand machen.
__________________
the0bone
Wissen ist Macht, nichts Wissen macht nichts!
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 03:14 Uhr.
|
 |