Rechtesystem/Denkanstoß

Chaosengel_Gabriel

Erfahrenes Mitglied
Guten Morgen liebe Leute...

Ich hab meine Web-Site fast fertig und möchte nun zum Abschluß noch die Seiten entsprechend meinem Rechtssystem sichern...
Am liebsten würde ich das machen indem ich für jedes Recht ne File erstelle, womit ich die Rechte überprüfe und ggf den Zugriff auf die Seite verweigere...

Die Seiten werden je nach Recht im Navi gezeigt/nicht gezeigt... Aber man könnte sie dennoch ohne entsprechendes Recht betreten, was ich ja verhindern will...

Ich möchte aber auch nicht um jede Seite einzeln nen if...else-Baum legen...

Ich brauch daher mal nen Gedankenanstoß, wie ich das realisieren könnte...
 
Wichtig ist dass kein Zugriff erfolgen kann, ob nun ueber einen Link oder einen direkten Aufruf.
Dafuer ist es wichtig im Script selbst die Rechte zu ueberpruefen, und nicht nur bei der Erstellung des Menues anhand der Rechte entscheiden ob der Link angezeigt werden soll oder nicht.

Du kannst besser alle Links anzeigen und dann auf einzelnen Seiten lediglich "Access denied!" anzeigen lassen als das Menue zu filtern und dann Leute trotzdem auf die Seite zu lassen wenn sie den richtigen Link erraten.

Bei meinem Management-System fuer EasyLFS an dem ich grad arbeite hab ich die Rechte in der Datenbank abgelegt. In den Scripts werden diese auf Konstanten abgebildet die dann dazu genutzt werden zu entscheiden ob Zugriff erfolgen darf oder nicht.
Mal die Gruppenverwaltung als Beispiel:
PHP:
if ((($projectno==0) && ($permissions & PERM_GROUPS)) || (($projectno!=0) && ($permissions & PERM_PROJ_GROUPS)))
	{
Wie Du siehst gibt es bei mir Rechte in 2 Stufen: Globale und projekt-bezogene Rechte. Jedes Recht setzt ein Bit. Die Gesamtrechte fuer einen User hole ich mit der folgenden Funktion:
PHP:
function getpermissions($user,$project,&$multisql)
{
	if ($user==false)
		{
			return 0;
		}
	$resultset=$multisql->getresultset();
	$multisql->query("select `grouppermissions`.`value` from `grouppermissions` join `groups` on `groups`.`id`=`grouppermissions`.`group` where `groups`.`id` in (select `group` from `usergroups` where `user`=".$user.") and `groups`.`project` in (0,".$project.")");
	$permissions=0;
	while ($userpermissions=$multisql->fetch_assoc())
		{
			$permissions|=$userpermissions['value'];
		}
	$multisql->setresultset($resultset);
	return $permissions;
}
Hier werden die globalen Rechte und die Rechte aus Gruppen zum jeweiligen Projekt zusammengesetzt.
Da die Rechte binaer abgebildet sind ist dies ja kein Problem.

Hier die von mir genutzten Rechte:
SQL:
INSERT INTO `permissions` (`value`,`permission`,`constname`,`global`) VALUES
(1,'Manage Site','PERM_SITE',true),
(2,'Manage Projects','PERM_PROJECTS',true),
(4,'Manage Groups','PERM_GROUPS',true),
(8,'Manage Menus','PERM_MENUS',true),
(16,'Manage Documents','PERM_DOCS',true),
(32,'Manage Project-Infos','PERM_PROJ_PROJECTS',false),
(64,'Manage Project-Groups','PERM_PROJ_GROUPS',false),
(128,'Manage Project-Menus','PERM_PROJ_MENUS',false),
(256,'Manage Project-Documents','PERM_PROJ_DOCS',false),
(512,'Manage Project-Packages','PERM_PROJ_PAKS',false),
(1024,'Manage Project-Files','PERM_PROJ_FILES',false);

God-Mode ist entsprechend 2047, dabei sind dann alle Bits gesetzt und somit voller Zugriff moeglich.
Rechte werden bei mir nicht dem User zugeteilt, sondern einer Gruppe. Eine Gruppe kann wiederum einem Projekt zugeteilt sein oder eben auch nicht.
Und natuerlich kann jeder User in mehreren Gruppen sein.
Wie in der Funktion gezeigt ergeben sich die Rechte des Users dann eben aus den Rechten die er ueber die Mitgliedschaft in verschiedenen Gruppen hat, allen globalen Gruppen in denen er Mitglied ist und allen Gruppen des aktuellen Projekts in denen er Mitglied ist.
 
Ich hab ja vor auf den Seiten auch nch mal seperat das Recht prüfen zu lassen... Aber ich möchte nicht unbedingt jeden Skript um mehr als ein include erweitern, um das Abfragen und prüfen der Rechte mit ner seperaten File zu machen...

Spart mir auch arbeit, wenn ich für andere Projekte andere Rechte benutze^^

Ach ja und ich bastel mein eigenes CMS ;) mein erstes :D
 
Zuletzt bearbeitet:
PHP:
if($no_permission)
{
  die("Sorry sir, don't wanna show ya the page.");
}

Sowas? --> Ganz einfach auf jeder Seite ganz oben einfügen. Wenn der Benutzer keine Rechte besitzt die Seite anzuzeigen brichst du die Code-Ausführung mit die() ab.
 
.htaccess schützt nur das Verzeichnis vor direktem Zugriff, aber nicht die Files darin vorm includen...

Die idee mit em die() werd ich probieren, damit wirds schon werden...
War mir nur nicht klar, wie ich mit einem Befehl das ganze Skript anhalten kann...
 
Machs dir doch nicht so schwer ..
PHP:
if(!$loggedin) {
   header("Location: index.php?page=access_denied");
}


Bitte aufpassen!

Ein Header bricht nicht die Ausgabe ab ... hast du z.B. sensitiven Code hinterbei wird der immer noch angezeigt!

PHP:
<?php
  header("Location: http://localhost");
  echo "VORSICHT! Ich bin immer noch sichtbar!";
?>

zeigt folgenden Code an wenn man ihn über telnet ansteuert:

Code:
C:\Dokumente und Einstellungen\root>nc localhost 80
GET /_sandkasten/security_test/header_secure.php HTTP/1.1
Host: localhost

HTTP/1.1 302 Found
Date: Tue, 16 Oct 2007 11:04:55 GMT
Server: Apache/2.0.54 (Win32) mod_ssl/2.0.54 OpenSSL/0.9.8 PHP/5.0.4 mod_autoindex_color
X-Powered-By: PHP/5.0.4
Location: http://localhost
Content-Length: 38
Content-Type: text/html

VORSICHT! Ich bin immer noch sichtbar!

Besser also

PHP:
if(!$loggedin) {
   header("Location: index.php?page=access_denied");
   die();
}
 
Zurück