Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Admin Mode für eine PHP Seite?!?





Frage

Hallo Leute, Ich habe mir gerade überlegt wie ich eine Art "Admin Mode" für meine PHP-Seite realisieren könnte! Dabei bin ich zu einer Lösung gekommen von der ich mir aber nicht sicher bin ob sie geeignet(sicher) wäre. Ich könnte ja eine zweite vorgelagerte Startseite erzeugen zb.: Admin.php . Auf dieser Seite überprüfe ich dann das Passwort und den Usernamen und übergebe dann fortan ein Admin-flag (zb.: "index.php?usermode=admin") an alle Skripte weiter. Nun müssten die Skripte nur noch prüfen ob das Admin-Flag übergeben wurde und dann entsprechend reagieren, indem sie zb.: einen Edit-Link anzeigen der im Normalfall nicht zu sehen wäre. Könnt ihr mir eure Meinung dazu sagen, ich wäre für jede Kritik oder Anregung dankbar!

Antwort 1 von REICHR

hast du da eine datenbank eingebunden wo die texte usw. abgefragt werden?

Antwort 2 von tak

@REICHR

ja hab ich! mysql

Antwort 3 von Markus Brock

Meiner Ansicht nach zu umständlich (wg. dynamisch erzeugter Links) und zu gefährlich (wg. Referer, wenn Du auf ne externe Seite gehst)!
Ich würde es mit Cookies machen.
Vielleicht gehts auch über Sessionfunktionen (damit kenn ich mich nich aus).

Antwort 4 von REICHR

sowas würde ich (meine eigene meinung) über ne datenbank machen!
auch wenn du kein admin menü dazu dann hast - du hast wenigstens dein phpmyadmin wo du änder willst auch gleich von da machen kannst wo du bist...

Antwort 5 von dome85

ich selber hab für meine homepage lyricsweb.net auch ein admin menü erstellt, das ist nicht sichtbar (so solls ja auch sein) ist eigentlich eine eigene webseite, die für mich die wichtigsten sachen bereitstellt löschen,... ganz schlicht, ohne grafiken => das nötigste. ich finde, das ist das einfachste in jede seite noch die adminfunktionen einbauen, das ist noch meiner meinung noch aufwendiger. kommt natürlich auch drauf an, was du für ne seite hast.

gruß
dominik

Antwort 6 von semi

Du brauchst keine Datenbank dafür.

Erstelle ein mit htaccess geschütztes Verzeichnis, wo Du die Sessiondaten ablegen kannst. z.B. "./admin"

<?php
// Das ist das Admin-Passwort, evtl. aus Datei lesen.
$PASSWORD  = "s3Q#Ra00a";
// Hier die Datei für die Session-Id
$ADMINFILE = "./admin/admin.session";
$ADMIN=0;

if(isset($_GET['[b]login'])) {
?>
  <form action="<?php echo $_SERVER['PHP_SELF'];?>">
  Passwort: <input type=password name="password">
  <input type=submit>
  </form>
<?php
}
else if(isset($_GET['[b]password'])) {
  if($_POST['password']==$PASSWORD) {
    srand((double)microtime()*1000000);
    $sid = md5(uniqid(rand()));
    $file = fopen($ADMINFILE, "w");
    fputs($file, $sid);
    fclose($file);
    $ADMIN = $sid;
  }
  else {
    header("Location: {$_SERVER['PHP_SELF']}?login=1");
    exit();
  }
}
else if($_GET['[b]sid']) {
  $storedSID = implode('', file($ADMINFILE));
  $ADMIN = ($_GET['sid']==$storedSID)?$storedSID:0;
}
unset($PASSWORD);
unset($ADMINFILE);
?>

Diesen Codeausschnitt speicherst Du in einer Datei z.B. admincheck.php
und verwendest es in jeder Datei am Anfang mit include("admincheck.php");
In der Variable $ADMIN steht dann entweder 0 oder die Session-Id eines Admin, die Du bei jedem Link weitergeben mußt.

Antwort 7 von semi

Ups. Nach dem Loginformular soll exit kommen.

...
if(isset($_GET['login'])) {
?>
  <form action="<?php echo $_SERVER['PHP_SELF'];?>">
  Passwort: <input type=password name="password">
  <input type=submit>
  </form>
<?php
  exit();
}
else if...


Antwort 8 von semi

Noch etwas.
Statt
if($_POST['password']==$PASSWORD) {
lieber
if($_GET['password']==$PASSWORD) {

Antwort 9 von tak

@REICHR Natürlich würde phpmyadmin ausreichen, aber es soll ja ein bischen komfortabler sein :-)

@dome85 Ein kleines Admin Menü hab ich natürlich auch schon, aber da hab ich doch momentan dann genau das gleiche Problem mit den Referen, wie von Markus Beschrieben!
Mal angenommem meine Admin Seite heisst Admin.php dann könnte man aus dem Referer entnehmen, das ich gerade von http://www.haumichblau.de/admin.php kam. Das wäre dan mindestens genauso unsicher. Ja, natürlich würde ich die Seite dann nicht Admin.php sondern meinetwegen wurzelsepp.php nennen. Hier bräuchte man aber wenigstens noch eine zusätzliche Sicherheit, wie ein .htaccess File oder ähnliches.

Aber ich merke schon, Sicherheit ist ein Thema das dummer Weise mit 'ner Menge Aufwand daherkommt.

Vielen Dank schon mal für eure Mühe!




Antwort 10 von REICHR

@tak

naja, diese meinung teile ich halt nicht mit dir ;-)

ich machs halt lieber mit sql oder mysql datenbanken

lg
chris

Antwort 11 von tak

@semi

WOW, vielen Dank, habe heute Nachmittag schon einen Tipp von dir iplementiert. Es war der mit Verbindungsdaten für MySql Datenbank, die in einem File gespeichert und dieses dann "required" wurde.

Ich teste das eben mal schnell aus und dann melde ich mich noch mal!

Dieses Prinzip der Authentifizierung wird doch so oder so ähnlich auch bei phpBB verwendet, oder?

Antwort 12 von semi

Kein Ahnung. phpBB kenne ich nicht.

Antwort 13 von tak

@semi

phpBB ist eine freie Forum Software in PHP geschrieben!

zurück zum Thema:

Ich habe jetzt folgendes Problem: Wann immer ich jetzt meine Seiten normal aufrufe, also im nich Admin Mode, bekomme ich folgende Fehlermeldung:

Undefined index: sid in c:\inetpub\wwwroot\admincheck.php on line 35


Ist auch irgendwie klar warum, denn die Variable sid ist ja dann auch noch nicht definiert! Müsste es dann im letzten else if nicht heißen:

else if(isset($_GET['sid'])) {
$storedSID = implode('', file($ADMINFILE));
$ADMIN = ($_GET['sid']==$storedSID)?$storedSID:0;}
usw. 


Wenn ich es so mache bekomme ich die Fehlermeldung nicht mehr!

Momentan arbeite ich hier mit dem sogenannten gefährlichen Halbwissen, vielleicht sollte ich erst noch mal ein paar Grundlagen von PHP erarbeiten. Manchmal neige ich zu der Überzeugung kennt man eine Sprache kennt man alle.

Antwort 14 von semi

Klar, die Korrektur von dier ist...ehh. korrekt. :)
Das mit dem "Kennt man eine Sprache, kennt man alle" ist auch meine Meinung.
Zumindest, wenn man als Ausgangsbasis C/C++-Kenntnisse mitbringt.
Die sprachspezifischen Details findet man schnell heraus, wenn man weiß, wie man mit Dokumentationen umgehen kann und etwas Verständnis für die serverseitige Programmierung mitbringt.
(Mit Perl geht selbstverständlich viel mehr)
Ich hielt Perl anfangs für einen mißlungenen Konvertierungsversuch einer ASCII-Datei bis ich es besser wußte :-)


Antwort 15 von tak

@semi

Perl steht als nächstes auf meiner Liste, hatte ich auch schon mal begonnen aber dann abgebrochen, weil ich auf der Arbeit VBS einsetzen musste.
(Übrigens ein sehr mächtiges Tool für die Windows Leute, zumal es im BS schon integriert ist!)
Bis zum nächsten Mal und nochmals vielen Dank !!! :-)

Antwort 16 von tak

Hallo Leute,

Leider habe ich festgestellt, dass mich auch semis Lösung nicht vor dem Problem mit den Referern schützt. Sollte ich also auf meiner Seite irgendwo einen externen Link klicken, der mich auf eine andere Seite führt, die dann blöderweise noch meinen Referer ausliest, müsste man diesen dann nur noch mit Copy und Paste in seinen Browser einfügen und schon wäre man auf meiner Seite im Admin Modus.
Also hab ich mir überlegt wie ich das ganze Verfahren noch sicherer machen könnte.

Der Trick liegt darin, die eigene IP-Adresse verschlüsselt mit in die SID einzubinden und diese dann ständig mit der aktuellen IP zu vergleichen.

Natürlich ist auch das keine ultimative Lösung, aber sie ist zumindest etwas sicherer.

Falls jemand Interesse hat hier ist der Scriptcode!

<?php
// Das ist das Admin-Passwort, evtl. aus Datei lesen.
$PASSWORD  = "haumichblau";
// Hier die Datei für die Session-Id
$ADMINFILE = "./admin/admin.session";
$ADMIN=0;
if(isset($_GET['login']))
	{
	?>  
	<form action="<?php echo $_SERVER['PHP_SELF'];
	?>">
 	Passwort: <input type=password name="password">
  	<input type=submit>
 	</form>
	<?php
 	exit();
	}
else if(isset($_GET['password']))
	{
	if($_GET['password']==$PASSWORD)
		{
    		srand((double)microtime()*1000000);
    		$sid = md5(uniqid(rand()));
    		
    		//*** Hier habe ich mir erlaubt die Remote IP-Adresse ins Long Format umzuwandeln...
    		//*** 666 hinzu zu addieren und das ganze an die Variable $sid anzuhängen. 
    		//*** Nun enthält meine neue SID auch meine IP-Adresse die ich durch einen ...
    		//*** unheimlich komplizierten Verschlüsselungsalgorythmus verschleiert habe!
    		$sid .=((ip2long($REMOTE_ADDR))+666);
    		$file = fopen($ADMINFILE, "w");
    		fputs($file, $sid);
    		fclose($file);
    		$ADMIN = $sid;
  		}
  	else
		{
    		header("Location: {$_SERVER['PHP_SELF']}?login=1");
    		exit();
  		}
	}
else if(isset($_GET['sid']))
	{
	$storedSID = implode('', file($ADMINFILE));
	
	// *** Hier wird dann der IP-String wieder von der eigentlichen SID getrennt!
	$ipcheck =(substr($storedSID,32));
	// *** nun von der IP im Long Format wieder 666 subtrahieren und die IP-Adresse...
	// *** wieder ins Normal Format umwandeln  
	$ipcheck =(long2ip($ipcheck-666));
	// *** Jetzt wird die soeben entschlüsselte IP-Adresse mit der aktuellen verglichen...
	// *** und wenn sie nicht übereinstimmen fliegt der Angreifer raus!
	if ($ipcheck <> $REMOTE_ADDR) {
		print "Stirb, reudiger Hund!";
		header("Location: {$_SERVER['PHP_SELF']}?login=1");
		exit();
	}
	$ADMIN = ($_GET['sid']==$storedSID)?$storedSID:0;
	}
unset($PASSWORD);
unset($ADMINFILE);
?>


Antwort 17 von semi

Wenn Du auf einen Link klickst, dann wird nicht nur die Referrer Adresse mitgeteilt sondern auch Deine IP Adresse.
Kennt einer beides, dann kann er trotzdem rein. Umständlich aber möglich. Stichwort IP-Spoofing.
Aber Du hast recht, Deine Variante ist schon etwas sicherer gegen Möchtegernhacker. :)

Antwort 18 von Markus Brock

Sicherer und einfacher wäre es, die SessionID im Cookie zu speichern.

Antwort 19 von Markus Brock

Natürlich verschlüsselt ..

Antwort 20 von tak

@semi

Deshalb auch die Zeile mit der ultimativen Lösung.

Löscht man allerdings das admin.session File am Ende der Admin Sitzung wird's wieder schwieriger. Der Hacker müsste es dann noch während der aktiven Sitzung des Admins versuchen.

Oder noch besser. Einfach externe Links weglassen! :-)

Das ist wirklich ein sehr interessantes Thema. Vielleicht finde ich sogar noch 'ne bessere Lösung.

Antwort 21 von tak

@Markus

Danke für den Tipp, vielleicht lässt sich das sogar kombinieren...

Antwort 22 von Markus Brock

Die Kombination hatte ich gemeint.
Aber ich habs mir noch mal überlegt.
Ich trete von meinem Ratschlag zurück. :)

Eigentlich reicht es vollkommen, das gewünschte Adminpasswort ins Cookie zu schreiben.
Dann erspartst Du Dir die Datenweitergabe über die Links.

Antwort 23 von tak

@Markus

Quasi, bei Anmeldung Cookie schreiben, anschließend für jedes php script abfrage auf Session-Cookie einbauen. So also realisiert man dann auch den Autologin, stimmt's? Eine Frage des Verfalldatums.
Irgendwo gib's da bestimmt auch wieder einen Haken!?!

Antwort 24 von Markus Brock

Bei den Haken kann man sich leider nie sicher sein :)
Mein Vorschlag (nur Passwort im Cookie) ist dann gefährlich, wenn man den Rechner nicht alleine benutzt.
SessionID im Link und -am besten mithilfe von Adminpasswort- verschlüsselte SID im Cookie dürfte aber ziemlich sicher sein.
Hoffe ich werde nicht gleich widerlegt ;)

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: