PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Login-Problem (https://www.php-resource.de/forum/php-developer-forum/84049-login-problem.html)

dr_mario 17-05-2007 18:49

Login-Problem
 
Hallo,

ich habe ein Login (Benutzername, Kennwort), bei dem man, bei Eingabe der korrekten Daten zu einer Seite start.php weitergeleitet wird. Falls der Benutzername "admin" ist, wird man zur Seite admin.php weitergeleitet. Vor der Weiterleitung wird eine Session gestartet, die, solange man sich nicht ausloggt, von Seite zu Seite weitergeführt wird.

In der Login-Datei:
PHP-Code:

ini_set('session.use_cookies'1);
ini_set('session_use_cookies_only'1);
session_start();
$_SESSION['user_id'] = $data["id"];
$_SESSION['sid'] = session_id();
if (
$name == "admin")
{
     
header("Location: admin.php");
}
else
{
     
header("Location: start.php");
}
exit; 

Auf den Folgeseiten:
PHP-Code:

ini_set('session.use_cookies'1);
ini_set('session_use_cookies_only'1);
session_start();

if(
$_SESSION['sid'] == session_id())
{
//Seiteninhalt
}
else
{
echo 
"Sie sind nicht eingeloggt";


Das Problem ist, dass wenn man als "normaler" User eingeloggt ist, einfach admin.php in die Adresszeile eingeben kann und ohne weiteres im Admin-Bereich landet, da eine Session ja bereits besteht.

Wie kann ich das Problem beheben?

Vielen Dank im Voraus

Viele Grüße,
Mario

Griecherus 17-05-2007 19:00

Du musst natürlich auch dafür sorgen, dass die admin.php prüft, ob der Benutzer, der sie aufgerufen hat, auch berechtigt ist, das zu tun. Also musst du entsprechende Änderungen an der admin.php selbst vornehmen, nämlich die Überprüfung, ob es sich um "admin" handelt.

Davon abgesehen birgt dein System eventuell noch andere Risiken. So ist es für dich besonders wichtig, dass Benutzernamen einmalig sein müssen, denn sonst kann sich jemand unter dem Namen "admin" registrieren, der eigentlich gar keiner sein soll, und hat damit deinem System gezeigt, wer die Hosen anhat.

Allgemein würde ich dir eher dazu raten, das Ganze besser zu durchdenken und den Zugang zu kritischen Seiten nicht nur anhand eines Benutzernamen zu gestatten.

dr_mario 17-05-2007 19:19

Hi,
danke schon mal für die schnelle Antwort.

Ich habe jetzt beim Login, falls sich der Admin anmeldet, eine neue Session-Variable "is_admin = TRUE" deklariert, die dann auf jeder Admin-Seite abgefragt wird.

Benutzername und Kennwort werden in einer Datenbank verwaltet und bei Registrierung auf Einzigartigkeit geprüft.

Ich hoffe, dass ich jetzt einen einigermaßen sicheren Login habe, oder sieht noch jemand triviale Sicherheitslücken?

Falls jemand einen guten Link zu diesem Thema hat (ja, ich hab vorher Google verwendet), würde ich mich darüber freuen!

Viele Grüße,
Mario

Griecherus 17-05-2007 19:33

Gut. Nach welchen Kriterium wird bei einem Login ausgemacht, ob die is_admin-Flag auf true gesetzt wird?
Ansonsten ist es relativ schwer zu sagen, ob es noch Sicherheitslücken in deinem Login gibt, ohne Code zu sehen. Interessant wären natürlich die SQL-Anfragen, Stichwort SQL-Injection. Vielleicht postet du ja mal entsprechenden Code, dann schauen wir mal.

dr_mario 17-05-2007 20:08

Nach Eingabe von Name (die Email-Adresse) und Passwort wird erst überprüft, ob der Name vorhanden ist und ob das dazugehörige Passwort stimmt, danach wird die o.a. Verzweigung durchgeführt.

Das Login-Formular ist mit QuickForm erstellt, wobei der Login-Namen (die Email-Adresse) auf ein richtiges Email-Format geprüft wird. Falls man also SQL-Injection versucht, wird eine falsche Eingabe erkannt.

Ich würde ja den Quellcode posten, da aber einige Klassen davon abhängen, wäre er recht lang. Mit Schlagworten nach denen ich googlen kann, wie eben SQL-Injection, ist mir schon sehr geholfen!

Ich habe gelesen, dass es sinnvoll ist, bei jeder Aktion eine neue Session-ID mit session_regenerate_id zu generieren, um ein abhören bzw. Austesten der SID zu verhindern...

Griecherus 17-05-2007 20:16

Damit ist mir das Kriterium, nach dem dein Skript einen Administrator als solchen erkennt, immer noch nicht klar. :)

SQL-Injections ist ein sehr wichtiges Stichwort. Auf QuickForm würde ich mich was das angeht nicht verlassen; deine SQL-Anfragen müssen für sich selbst sicher sein, vom Benutzer stammende Parameter dementsprechend maskiert werden etc. pp.

Die Session-ID bei jedem Request neu zu generieren, halte ich für unnötig. Das gilt allerdings nicht, wenn es sich um kritische Aktionen handelt (nach erfolgreichem Login, Änderungen am Profil oder sonstiges).

dr_mario 17-05-2007 20:43

Also: nachdem Email und Password mit der DB abgeglichen und als korrekt erkannt sind, wird auf die Seite admin.php weitergeleitet, wenn die Emailadresse die des Admins ist (dann wird außerdem is_admin = true gesetzt), ansonsten wird auf die seite start.php verwiesen...

Griecherus 17-05-2007 20:57

Wieso fügt du deiner Datenbanktabelle keine Spalte "is_admin" hinzu? Damit hättest du auch die Möglichkeit problemlos(er) andere Benutzer zu Admins zu machen, ohne ihre E-Mail-Adressen mit einer ellenlangen Liste abgleichen zu müssen. Nur als Vorschlag.

Wenn du das Ganze dynamischer gestalten möchtest, damit du auch mehrere Admins und gegebenenfalls auch andere Gruppen bedienen kannst, dann such mal nach Rechtesystem im Forum oder bei Google, da wirst du fündig.

Ich hoffe dir ist geholfen. :)

dr_mario 17-05-2007 21:58

sehr guter Vorschlag :)

Vielen Dank für die schnelle Hilfe!


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:52 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG