|
|
|
Community
9dots.de Webdesign Board
|
|
|
|
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
zaffi Mitglied
Angemeldet: 28.07.2004 Beiträge: 52
|
Verfasst am: 07.08.2004, 03:12 Titel:
Loginscript |
|
|
|
|
Ok, dann will ich mal anfangen. Da es mein erstes Tutorial überhaupt ist, hoffe ich, dass ich alles richtig mach und mich nicht zu dumm anstelle. Und ich weis selbst, dass ich in Deutsch nicht besonders gut bin und PHP noch viele Fehler mache.
Voraussetzung
- Genügend Zeit
- Space mit PHP & MySQL
Info
Ich arbeite mit Sessions & md5-Verschlüsselung, trotzdem ist ein Script NIE hacksicher. Es sind mehrer Benutzer möglich mit verschiedenen Rechten. Meine MySQL-Tabelle für das Loginscript habe ich "login" genannt. Ich habe mich nur auf Username, Password und Rechte beschränkt.
______________________________________________
Code: |
#### index.php ####
<?
session_start();
session_register("login_id","login_user","login_password","login_right");
$xid = session_id();
include ('config.php');
?>
|
Fangen wir mal mit der ersten Seite an. Diesen Code müsst ihr in die erste Datei (z.B. index.php) schreiben, die auf eurer Page erscheint, da er nun die Session erstellt (siehe session_start) und über den ganzen Besuch hin gebraucht wird. Durch den Befehl session_register registrier ich mehrere Variablen innerhalb der Session. Ich speichere die SessionID in die Variable $xid. Durch den Befehl include ('config.php'); lass ich die MySQL-Daten einlesen.
Code: |
#### config.php ####
<?
$dbserver ="****";
$dbuser ="****";
$dbname ="****";
$dbpasswd ="****";
$db=mysql_connect($dbserver,$dbuser,$dbpasswd);
mysql_select_db($dbname,$db);
?>
|
Hier sind die ganzen MySQL-Daten in Variablen gespeichert und der "mysql_connect" auch in eine Variable.
Code: |
#### navigation.php ####
<?php
if ($login_user != "")
{
$mdata_temp = mysql_query("SELECT * FROM login WHERE user = '$login_user'");
$mdata = mysql_fetch_array($mdata_temp);
$m_id = $mdata[id];
$m_user = $mdata[user];
$m_password = $mdata[password];
$m_right = $mdata[right];
if ($m_right == 1)
{
echo "User mit dem Recht 1";
}
if ($m_right == 0)
{ echo "Text, egal für welchen Wert.";
}
echo "":
}
else {
echo "<tr>";
echo "<td colspan='2'><b>.: Login :.</b><br></td>";
echo "</tr>";
echo "<form method='post' action='login.php'>";
echo "<tr>";
echo "<td>Benutzername:</td>";
echo "<td align='right' valign='middle'><input class='input_login' name='login_user' type='text' size='15'></td>";
echo "</tr>";
echo "<tr>";
echo "<td>Passwort:</td>";
echo "<td align='right' valign='middle'><input class='input_login' name='login_password' type='password' size='15'></td>";
echo "</tr>";
echo "<tr>";
echo "<td height='25' align='right' valign='middle' colspan='2'><input class='input_login' name='login' type='submit' value='LogIn'></td>";
echo "</tr>";
echo "</form>";
}
?>
|
Zur Erklärung Als erstes wird geprüft ob du eingelogt bist if ($login_user != "") {}. Wenn du eingelogt bist, werden die Daten aus der MySQL-Tabelle gelesen, darunter auch deine Rechte. Mit der if-Abfrage kannst du jetzt bestimme Befehle, Links usw. einem bestimmten Rechtewert zuteilen if ($m_right == 1). Wenn du aber nicht eingelogt bist else {....} erscheint dir das Loginfeld. Jetzt kannst du deinen Username eingeben und dein Password und auf "LogIn" klicken und du wirst auf die login.php verwiesen.
Code: |
// #### login.php ####
<?
if ($login != '' && $login != 'none') {
$user = $_POST['login_user'];
$pass = md5($_POST['login_password']);
$mdata_temp = mysql_query("SELECT * FROM login WHERE user = '$user'");
$mdata = mysql_fetch_array($mdata_temp);
$m_pass = $mdata[password];
$id = $mdata[id];
if ($m_pass == $pass)
{
$login_id = $id;
$login_user = $user;
$login_password = $pass;
session_register("login_id","login_user","login_password");
$xid = session_id();
echo "<b>Login war erfolgreich!</b><br>";
echo "Sie werden weitergeleitet! - oder <a href='news.php'>hier</a> klicken";
echo "<meta http-equiv='refresh' content='2; URL=news.php'>";
} else {
session_destroy();
echo "<b>Sie haben ein falsches Passwort eingegeben<br>oder den Benutzer gibt es nicht !</b><br>";
echo "Sie werden weitergeleitet! - oder <a href='news.php'>hier</a> klicken";
echo "<meta http-equiv='refresh' content='5; URL=news.php'>";
}
}
?>
|
Durch die if-Abfrage if ($login != '' && $login != 'none') { musst du im dem Loginformular etwas eingegeben haben. Danach wird dein eingegebenes Password mit dem aus der Datenbank verglichen if ($m_pass == $pass). Sollte es stimmen, werden den Variablen in der Session, die wir vorher auf der ersten Seite erstellt haben, neue Werte zugeteilt. Falls es nicht stimmen sollte, wird deine Session zerstört und gelöscht. else {...}.
Code: |
// #### logout.php ####
<?
session_destroy();
echo "<b>Sie haben sich erfolgreich ausgelogt!</b><br>";
echo "Sie werden weitergeleitet! - oder <a href='news.php'>hier</a> klicken";
echo "<meta http-equiv='refresh' content='5; URL=news.php'>";
?>
|
In dieser Datei wird deine Session gelöscht und wirst automatisch ausgelogt. Das bedeuted, du kannst einen link auf diese Datei setzen zum Auslogen.
Code: |
// #### geschützte datei ####
<?
if ($login_user != "") {
$mdata_temp = mysql_query("SELECT * FROM login WHERE user = '$login_user'");
$mdata = mysql_fetch_array($mdata_temp);
$m_id = $mdata[id];
$m_user = $mdata[user];
$m_password = $mdata[password];
$m_right = $mdata[right];
if ($m_right == 1)
{
}
if ($m_right == 0)
{
}
}
else {echo "<b>Sie müssen sich erst einloggen!</b>";}
?>
|
Als erstes wird wieder geprüft ob du eingelogt bist if ($login_user != ""). Falls nein, wirst du aufgefordert dich einzuloggen else {echo "<b>Sie müssen sich erst einloggen!</b>";}Zwischen if ($login_user != "") { und } werden jetzt deine Rechtewerte geprüft, ob du für das Script oder was auch immer überhaupt zugelassen bist.
Code: |
CREATE TABLE `login` (
`id` int(3) NOT NULL auto_increment,
`user` varchar(35) NOT NULL default '',
`password` varchar(35) NOT NULL default '',
`right` varchar(50) NOT NULL default '0',
PRIMARY KEY (`id`)
)
|
So die die MySQL-Tabelle aus. Also ich weis nicht ob die Befehle so passen, deswegen hab ich auch noch lieber ein Bild gemacht. ->Hier<-
______________________________________________
So das dürfte es gewesen sein. Ich entschuldige mich nochmal für mein schlechtes Deutsch und für meinen komischen Codingstil. Ich hoffe es hilft euch trotzdem weiter. Fragen bitte posten. Wenn ich etwas zu unklar erklärt habe, auch posten.
Zur Zeit arbeite ich auch noch an einem Registerscript. Bin schon ziemlich weit. Ich werde es hier auch noch posten so bald es fertig ist. Ich bin für Verbesserungsvorschläge offen. Naja, es ist schon ziemlich spät, deswegen hör ich besser auf, sonst schreib ich noch mehr Dummheiten. |
|
Nach oben |
|
|
Thomas`tiweb Mitglied
Angemeldet: 03.08.2004 Beiträge: 115 Wohnort: Bruchsal
|
Verfasst am: 07.08.2004, 07:03 Titel:
|
|
|
|
|
nettes tutorial, ich habe aber - wenn du erlaubst - noch einiges anzumerken
1. session-speicherort: bei grossen (aber auch kleinen) scripten, eignet sich die mysql-tabelle wunderbar fuer die daten der sessions. d.h. alle daten ueber alle user (oder gaeste) die momentan eine session der seite besitzen, sind in einer mysql-tabelle (sehr schoen um heraus zu finden, wer alles online ist, etc)
dies macht man mit der funktion session_set_save_handler();
lest euch am besten das bei php.net durch, ist etwas schwierig, aber wenns klappt, dann freut man sich umso mehr
2. die rechte wuerd ich grundsaetzlich in einer neuen tabelle `right` speichern, als recht bevorzuge ich ein wort (andere machen es z.b. mit zahlen), z.b. das recht news zu adden: NEWS_ADD
3. arbeitet mit konstanten, sie erleichtern alles! konstanten werden einmalig mit einem wert definiert, und koennen nicht mehr (und sollten auch nicht mehr) umdefiniert, etc. werden - d.h. der wert ist fest. auf konstanten kann ueberall im script zugegriffen werden (sind also global)
4. sonst sieht es huebsch aus, ausser den sachen von wegen kommentieren, ausgeben, etc - das ist aber jedem sein eigener stil
5. was noch waere : fang die variablen von $_POST, $_GET und $_COOKIE erst ab und check sie durch - wenn ein user im formular als user nun ' eingibt, koennte es leicht passieren das die im mysql-query rumpfuschen koennen
6. nen cookie-login bauste auch noch, oder ?
7. und gaaanz wichtig, haett ich beinahe vergessen: session koennen per session id von egal welchem computer uebernommen werden. deswegen speichert man in der session noch die ip ab, die der "rechtmaessige" besitzer hat (also der, der die session eingeleitet hat).
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
dann fraegt man JEDES MAL (!!!) wenn die session initialisiert wurde (also nach session_start() ab, ob $_SESSION['ip'] == $_SERVER['REMOTE_ADDR'], falls dies nicht der fall ist, session_destroy();
... und weg ist wieder ne sicherheitsluecke |
|
Nach oben |
|
|
zaffi Mitglied
Angemeldet: 28.07.2004 Beiträge: 52
|
Verfasst am: 07.08.2004, 12:18 Titel:
|
|
|
|
|
Danke für die Verbesserungsvorschläge. Ich werde zwar bisschen Zeit brauchen das alles umzusetzen, weil ich noch nie so richtig intensiv mit PHP beschäftigt habe und es deswegen nicht so gut beherrsche aber ich probiers einfach mal. Was mir noch so vorschwebt ist
- Cookieunterstützung
- Registration
- Profilcenter
- Sicherheitslückenstopfen
Bei der Cookieunterstützung komm ich überhaupt nicht weiter weil ich davon überhauptkeine Ahnung, weil ich Cookie nur mit Java kenne und ich das überhaupt nicht kann. Registration hab ich noch das Problem wegen dem Usernamen, weil der nur einmal sein sollte und ich einfach zu dumm bin ne if-Abfrage zu erstellen die das bei der Registration verhindern soll. Profilcenter dürfte eigentlich kein Problem sein, falls es jmd braucht kann ichs vielleicht gleich machen. Sicherheitslücken die du genannt hast werd ich versuchen zu "stopfen".
Nochmal danke für die Infos und Hilfen.
// #### Edit ####
Könntest mir das mal mit nem session_set_save_handler zeigen, an nem Beispiel? Ich blick da ganz ehrlich nicht durch Wär nett |
|
Nach oben |
|
|
Thomas`tiweb Mitglied
Angemeldet: 03.08.2004 Beiträge: 115 Wohnort: Bruchsal
|
Verfasst am: 07.08.2004, 18:33 Titel:
|
|
|
|
|
also 1. Cookies:
Cookies kann man nur erstellen, aendern oder setzen, wenn die Page-Ausgabe noch nicht gestartet wurde (ebenso wie sessions). d.h. also auch ein leerzeichen vor dem php-start-tag <? wird einen fehler erzeugen.
Einen Cookie erstellt man mit setcookie('name', 'wert'); und man kann sie ueber $_COOKIE['name'] ansprechen.
Cookies werden auf dem Clienten gespeichert. Dieser schickt - wenn er einen Cookie findet, der zu dieser Domain passt - den Cookie mit. Schau dir am besten mal http://www.php.net/setcookie an.
2. session_save_handler (Achtung lang :
Beispiel:
Code: |
//Start der PHP Datei
//Die Parameter der Funktion, sind die Funktionsnamen der Funktionen, die bei den jeweiligen Aktionen ausgefuehrt werden sollen
//siehe www.php.net/set_session_save_handler
session_set_save_handler('sessionOpen', 'sessionClose', 'sessionRead', 'sessionWrite', 'sessionDestroy', 'sessionGC');
|
irgendwo anders in der php datei, erstellst du die jeweiligen (ich hab sie gekuezrt) funktionen:
Code: |
function sessionOpen($save_path, $session_name) { return true; }
function sessionClose() { return true; }
//Liest session_data aus der DB und gibt sie zurück
//AENDERN!
function sessionRead($idPar)
{
if (isset($idPar))
{
if (strlen($idPar) == 32)
{
$query = mysql_query("SELECT `data` FROM `session` WHERE `sessionid`='" . $idPar . "'");
$row = @mysql_fetch_row($query);
if (!$row[0]) $sessData = "";
else $sessData = $row[0];
return($sessData);
}
else return "";
}
else return "";
}
//Schreibt gegebene session_data in eine neue Zeile (oder falls Zeile der ID schon existiert, ändern)
//AENDERN!
function sessionWrite($idPar, $sessDataPar) { return true; }
//Loescht die angegebene session
//AENDERN!
function sessionDestroy($idPar) { return true; }
//Garbage Collector
//Diese Funktion dient dazu, die vorhandenen, abgelaufenen Sessions zu loeschen
function sessionGC($maxLifeTime) { return true; }
|
Die Parameter sind fest vorgeschrieben, den Namen der Parameter sind variabel. In die Funktionen gehoeren die MySQL-Queries. Achtung! Falls Fehler im MySQL-Query/PHP bestehen, wird kein Fehler ausgegeben, es funktioniert einfach nicht
Die Session-ID ist ein 32-Zeichen langer String.
Hier die Tabelle:
Code: |
session
sessionid //32 Zeichen langes VARCHAR, Index
data //TEXT, hier kommen von PHP die Infos rein
erstellt //timestamp, wann die session erstellt wurde
time //timestamp, der letzten aktualisierung der session
ip //die ip wird ebenfalls in der tabelle gespeichert, nicht zu verwecheln mit $_SESSION['ip']
file //die datei die gerade geoeffnet wurde, z.b. um ne statistik zu machen, wer alles welche datei geoeffnet hat
|
Hier noch ein paar Seiten:
http://www.dclp-faq.de/ch/ch-version4_session.html
http://de2.php.net/session_set_save_handler
Ich hoffe ich konnte dir helfen. |
|
Nach oben |
|
|
zaffi Mitglied
Angemeldet: 28.07.2004 Beiträge: 52
|
Verfasst am: 07.08.2004, 19:01 Titel:
|
|
|
|
|
Danke für die ganzen Hilfen, Links usw, aber ich blick da überhaupt nicht durch. Alles viel zu kompliziert. Ich check da garnichts mehr. Sry. |
|
Nach oben |
|
|
Thomas`tiweb Mitglied
Angemeldet: 03.08.2004 Beiträge: 115 Wohnort: Bruchsal
|
Verfasst am: 07.08.2004, 19:31 Titel:
|
|
|
|
|
np,
mach erstmal so weiter wie dus wolltest, dann kannst du spaeter auf das umschwenken (wenn du noch lust hast *bg) |
|
Nach oben |
|
|
zaffi Mitglied
Angemeldet: 28.07.2004 Beiträge: 52
|
Verfasst am: 07.08.2004, 21:05 Titel:
|
|
|
|
|
Hmmm, mir lässt es doch keine Ruh. Wo könnt ich den die setcookies hineinschreiben? Und soll ich den
Code: |
session_set_save_handler('sessionOpen', 'sessionClose', 'sessionRead', 'sessionWrite', 'sessionDestroy', 'sessionGC');
|
hinschreiben? |
|
Nach oben |
|
|
Thomas`tiweb Mitglied
Angemeldet: 03.08.2004 Beiträge: 115 Wohnort: Bruchsal
|
Verfasst am: 07.08.2004, 21:51 Titel:
|
|
|
|
|
du fraegst vor dem html-login-formular erstmal ab, ob es einen cookie gibt mit if (isset($_COOKIE['userid'])) ... falls ja, pruefst du die daten des cookies (obs den user gibt und ob das pw stimmt) ... falls nein, kommt der normale login (mit ner checkbox von wegen cookie setzen)
wenn man dann submit drueckt, user und pw stimmt, etc (und z.b. irgendwohin weitergeleitet wird) setzt man dann den cookie (davor darf aber noch nichts ausgegeben werden)
der save_handler wird vor dem session_start() initialisiert |
|
Nach oben |
|
|
zaffi Mitglied
Angemeldet: 28.07.2004 Beiträge: 52
|
Verfasst am: 07.08.2004, 21:54 Titel:
|
|
|
|
|
Ha, danke für die schnelle Antwort, werd das gleich mal ausprobieren wenn ich Zeit habe. |
|
Nach oben |
|
|
gladiator_ Gast
|
Verfasst am: 08.08.2004, 20:33 Titel:
|
|
|
|
|
Thomas`tiweb hat folgendes geschrieben: |
1. session-speicherort: bei grossen (aber auch kleinen) scripten, eignet sich die mysql-tabelle wunderbar fuer die daten der sessions. d.h. alle daten ueber alle user (oder gaeste) die momentan eine session der seite besitzen, sind in einer mysql-tabelle (sehr schoen um heraus zu finden, wer alles online ist, etc)
dies macht man mit der funktion session_set_save_handler();
lest euch am besten das bei php.net durch, ist etwas schwierig, aber wenns klappt, dann freut man sich umso mehr
6. nen cookie-login bauste auch noch, oder ?
7. und gaaanz wichtig, haett ich beinahe vergessen: session koennen per session id von egal welchem computer uebernommen werden. deswegen speichert man in der session noch die ip ab, die der "rechtmaessige" besitzer hat (also der, der die session eingeleitet hat).
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
dann fraegt man JEDES MAL (!!!) wenn die session initialisiert wurde (also nach session_start() ab, ob $_SESSION['ip'] == $_SERVER['REMOTE_ADDR'], falls dies nicht der fall ist, session_destroy();
... und weg ist wieder ne sicherheitsluecke |
1. mich würde interessieren, was man ausser user online noch herausfinden kann? fuer user online hab ich nämlich ein eigenes sehr gutes script, das im counter (bzw. page stats) integriert ist.
6. mit cookie login ärgert man sich besonders, also ganz wichtig:
cookie setzen:
Code: |
setcookie("CookieName","Wert",time()+3600*24,"/");
|
und löschen mit:
Code: |
setcookie("CookieName","Wert",time()-3600*24,"/");
|
wichtig ist dabei, dass der wert der gleiche ist, das datum in der vergangenheit liegt, und dass "/" als letztes argument, das heisst dass jede datei in diesem oder allen unterverzeichnissen auf das cookie zugreifen kann, denn wenn nicht, dann
setzt zB .php?arg1=val1 das cookie und löschen darf es .php?arg2=val2 NICHTmehr.
7. session würd ich nicht destroyen, würd eher mit session_name() den namen der session auslesen, und auf die gleiche url, allerdings ohne den parameter der session_id als GET argument .sonst wird der user, der den link verschickt hat, ausgeloggt.
beispiel:
aufgerufene URL : .php?arg1=val1&PHPSESSID=12345...
auf url, die weitergeleitet wird: .php?arg1=val1
kann man mit regex ganz schön machen
[/code] |
|
Nach oben |
|
|
Thomas`tiweb Mitglied
Angemeldet: 03.08.2004 Beiträge: 115 Wohnort: Bruchsal
|
Verfasst am: 09.08.2004, 00:23 Titel:
|
|
|
|
|
1. man kann z.b. die rubrik sehen, auf die welche user gerade sind, kann alle user auflisten, die gerade online sind (mit datei, id, etc) ... es ist alles sehr viel einfacher, weil man einfach nur nen mysql-query machen muss
6. oehm, also cookie loeschen macht man normalerweise mit dem Wert "", sonst raffen das mit der negativen zeit manche browser nicht oder der cookie bleibt mit dem wert bestehen (was z.b. auch sicherheitsrisiko ist) - auf das loeschen hat das, soweit ich weis - und soweit es auch bei mir geht, keinen einfluss
7. joa, hast recht - ich mach das sowieso mit rechten |
|
Nach oben |
|
|
gladiator_ Gast
|
Verfasst am: 09.08.2004, 07:12 Titel:
|
|
|
|
|
naja cookies sind ja an sich ein krampf...
[/quote] |
|
Nach oben |
|
|
unex`9dots Administrator
Angemeldet: 02.08.2003 Beiträge: 1106 Wohnort: Karlsruhe Interessen: Coding, Segeln, Schwimmen, PC
|
Verfasst am: 09.08.2004, 10:03 Titel:
|
|
|
|
|
auch wenns grad nicht zum Thema passt:
könntest du dich bitte anmelden gladiator_ sonst muss ich nurnoch posts von registrierten Usern zulassen. Danke.
P.S. ich mag Cookies auch nicht |
|
Nach oben |
|
|
Gast
|
Verfasst am: 09.08.2004, 11:48 Titel:
|
|
|
|
|
dann mach so dass nurnoch registered leute posten können..
ich meld mich nicht an, ausser ich hab grad lust drauf. |
|
Nach oben |
|
|
bl:nd Moderator
Angemeldet: 04.06.2004 Beiträge: 3499
|
Verfasst am: 09.08.2004, 14:58 Titel:
|
|
|
|
|
bist ja auch was ganz besonderes...
dann lass das mit dem registrieren doch bleiben und poste einfach nix mehr - bin mir sicher, dass wir hier auch ganz gut ohne dich zurechtkommen...
sry, aber das musste jetzt sein... |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|
|