PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interner Bereich mit verschiedenen Zugriffsrechten?



Tobias_Baus
24-02-2006, 08:01
Hallo zusammen,

ich habe folgendes Problem. Ich will mittels Apache einen geschützten Bereich erstellen, auf den nur bestimmte Leute Zugriff haben. Der Benutzer soll dann mit PHP ausgelesen werden, jedoch nur auf bestimmte Seite Zugriff haben. Das Verzeichnis zu schützen ist ja kein Problem, genauso wie das auslesen des Users mit PHP. Allerdings ist mir nicht so ganz klar, wie ich die "Rechtevergabe" am besten realisiere. Ich hab es mir bis jetzt so vorgestellt, dass ich eine "index.php" habe mit Layout etc. in den dann die einzelnen "Inhalte" reingeladen werden (per include_once();). Das Problem dabei ist jedoch, dass ich dabei in jeder einzelnen Datei eine Überprüfung nach dem User machen muss, und dann muss entschieden werden ob der User Zugriff daraus hat. Hat den Nachteil, dass ich in jeder einzelnen Datei diese Überprüfung machen muss (aus Sicherheitsgründen, damit man die Datei nicht einfach so aufrufen kann), was wie ich finde nur ne Notlösung ist.

Wie würdet ihr sowas realisieren? Ich glaub ich steh grade total auf dem Schlauch und komme absolut nicht weiter.

Es soll übrigens auch unterschieden werden ob der User Lese- oder Scheibzugriff hat (die Daten wollte ich in eine MySQL-DB schreiben & beim Zugriff auf die Datei auslesen).


Viele Grüße
Tobias

Pingu
24-02-2006, 09:37
Also in meiner beschränkten Sichtweise gibt es zwei Möglichkeiten, die sich sicherlich auch kombinieren lassen: Rechtevergabe auf Basis von Verzeichnissen Rechtevergabe auf Basis von Dateien

Ich habe für beides Lösungen erarbeitet, die sogar möglichst ohne ständige Datenbankabfragen auskommt.
Ich habe jetzt nicht ganz die Zeit, aber ich verusche es mal kurz anzureisen.

Meine alte Lösung (nich besonders flexible und ideale Lösung, implementiert hier: http://www.can-cia.org):
Alle Benutzer werden einer von definierten Gruppen zugeordnert. Wobei diese Gruppen eine Hirachie haben, z.B. Admin, Maintainer, Member, Nobody. Das vereinfacht die späteren Vergleiche erheblich, da man jedem einen Zahlenwert zuordenen kann. Später beim Vergleich muß man nur prüfen, ob die Rechte höher sind, also der Zahlenwert größer ist. Dann kann man in einer Datenbank hinterlegen, welche Rechte (also welcher Zahlenwert im Minimum) benötigt werden, um auf ein bestimmtes Verzeichnis zugreifen zu dürfen. Auf Dateiebene läßt sich dies noch einfacher lösen. Die benötigten Rechte werden z. B. einfach in das Titelfeld der HTML-Datei eingetragen. Der Vorteil des Titelfeldes gegenüber eines eingenen Tags ist, daß man dieses mit jedem Standard-HTML-Editor sofort bearbeiten kann. Alle HTML-Dateien, die keine zugeordneten Rechte im Titel haben bekommen ein Standardrecht. Auf der obigen Seite ist z.B. das Standardrecht "nur für Mitglieder". Wenn eine HTML-Datei für alle sichtbar sein soll, dann muß im Titel explizit [free] stehen.

Meine neue Lösung (wenn auch noch nicht ganz vollständig, implemented hier: http://www.pingu.info):
Jeder Benutzer kann mehreren Gruppen zuegordnet werden. Hiefür habe ich allerdings noch keine Administrationsinterface gemacht. Das heißt diese Einträge muüssen z.Zt. von Hand in der Datenbank vorgenommen werden. Dann lassen sich über eine XML-Datei im Verzeichnis die Rechte für Bilder setzen; für andere Dateitypen habe ich es nocht nicht umgesetzt. Diese XML-Datei kann Standardrechte für das Verzeichnis, in dem sie liegt, festlegen und zusätzlich abweichende Rechte für die Dateien. In den HTML-Dateien wird dies anderes geregelt. Hier gibt es spezielle Tags (<access type="??" user="???" group="??"></access>"), die um den jeweiligen Inhalt gelegt werden. Man kann diese Tags natürlich auch ganz einfach schachteln. Allerdings besteht halt das Problem, daß solche eigenen Tags von keinem Standard-HTML-Editor unterstützt werden und somit von Hand hinzugefügt werden müssen.
All diese selbstdefinierten Tags werden natürlich vor der Auslieferung wieder komplett gelöscht.

Ansonsten gibt es natürlich auch gute Beispiele bei den klassischen CMS, z.B. Drupal, Mambo, Typo3, Wordpress, …

Pingu

Tobias_Baus
24-02-2006, 11:16
Hi Pingu,

mir ist jetzt nicht ganz klar wie du verhinderst, dass User X auf die Datei geheim.php zugreift, obwohl er kein Zugriffsrecht hat? Er kann doch einfach in der Browserzeile domain.tld/login/geheim.php eingeben, obwohl er es eigentlich nicht darf. Oder habe ich etwas falsch verstanden?

Das mit den XML-Dateien ist keine schlechte Idee, damit hab ich zwar noch nie gearbeitet aber ich werds mir auf jeden Fall mal ansehen. :) Danke!

nEox
25-02-2006, 11:21
mir ist jetzt nicht ganz klar wie du verhinderst, dass User X auf die Datei geheim.php zugreift, obwohl er kein Zugriffsrecht hat?

Wenn du alles über eine "Index.php" laufen lässt, könntest du in deiner "Index.php" eine Konstante definieren. In den includierten Skripten kannst du dann prüfen ob diese Konstante gesetzt ist. Wenn nicht, kannst du das Skript mit "exit;" abbrechen.

Diese Berechtigungsverteilung, wie bei Pingu mit der XML-Datei, nennt man ACL (Access Control List). Such mal ein bisschen danach. Es gibt bereits recht interessante Projekte wie z. B.: http://phpgacl.sourceforge.net/

Grüße,

nEox

Tobias_Baus
27-02-2006, 16:22
Wenn du alles über eine "Index.php" laufen lässt, könntest du in deiner "Index.php" eine Konstante definieren. In den includierten Skripten kannst du dann prüfen ob diese Konstante gesetzt ist. Wenn nicht, kannst du das Skript mit "exit;" abbrechen.

Diese Berechtigungsverteilung, wie bei Pingu mit der XML-Datei, nennt man ACL (Access Control List). Such mal ein bisschen danach. Es gibt bereits recht interessante Projekte wie z. B.: http://phpgacl.sourceforge.net/

Grüße,

nEox
Hi nEoX,

das mit der Konstante ist keine schlechte Idee, allerdings habe ich dann immernoch das Problem, dass der Code in jede Datei muss. Ich werde mal noch weiter schauen ob es vielleicht doch noch ne Möglichkeit gibt (vielleicht per Apache oder so), und wenn nicht werde ich es so machen. Danke, auch für den ACL-Tipp. Wer mal etwas danach suchen (http://www.metager2.de).

nEox
27-02-2006, 21:27
das mit der Konstante ist keine schlechte Idee, allerdings habe ich dann immernoch das Problem, dass der Code in jede Datei muss.
Hallo Tobias,

du kannst auch per "auto_prepend_file" (http://de.php.net/ini.core#ini.auto-prepend-file) eine Datei definieren, die vor dem aktuellen Skript eingebunden wird.

Das lässt sich auch per Apache (HTACCESS oder direkt in die Config) setzen, dann gilt das nur in dem Verzeichnis (+Unterverzeichnisse) in dem die .htaccess-Datei liegt:

php_value auto_prepend_file /path/prepend.php

Grüße,
nEox

Pingu
28-02-2006, 09:14
Wie nEox eigentlich bereits schrieb, gibt es m.E. nur eine Möglichkeit; man läßt alles über ein zentrales Skript laufen. Ich sehe beim Apachen zwei Möglichkeiten dies zu realisieren. Das eine ist die von nEox angesprochene Variante. Ich habe mich für eine andere entschieden. Ich nutze die Rewrite-Engine von Apache. So wird bei mir im Hintergrund alles über ein zentrales Skript geleitet. Dazu habe ich im Hauptverzeichnis eine .htaccess liegen, deren Eigenschaften durch die Konstruktion von Apache glücklicherweise in die Untervezeichnisse weitervererbt werden. Die .htaccess sieht bei mir so aus:
## force that every static page is parsed by main.php
AddHandler application/x-httpd-php .layout

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} MSIECrawler
#RewriteCond %{REMOTE_ADDR} ^80\.126\.26\.28$ [OR]
#RewriteCond %{REMOTE_ADDR} ^63\.99\.105\.162$ [OR]
RewriteRule !robots.txt - [F]

RewriteRule !^layout/layout\.layout.* - [C]
#RewriteRule (.*) /~ts/ts/layout/layout.layout/$1 [E=BASEURL:/~ts/ts]
RewriteRule (.*) /ts/layout/layout.layout/$1 [E=BASEURL:/ts]


Beim Rewrite setzte ich hier noch zusätzlich eine Umgebungsvariable, die ich dann im Skript nutzen kann, um zu erkennen, ob ich auf dem Live-Server oder auf dem Test-Server arbeite. Denn beide nutzen etwas andere Basis-Pfade.

Im sog. doorway script, also dem Eingangsskript, wo alle Aufrufe transparent durchgeleitet werden, kann ich dann überprüfen, ob der Aufruf erlaubt ist oder nicht. Dadurch daß alle Aufrufe durchgeleitet werden, ist die Überprüfung nicht nur auf php- oder html-Dateien limitiert.
Im dooway script werden auch alle notwendigen php-Objekte initialisiert, z. B. Datenbankzugriff und auch Benutzerzugriffsverwaltung. Das doorway script kann entweder entsprechend des Benutzers und seiner Rechte einfach HTML-Dateien anzeigen oder nicht oder nur teilweise, indem sie z.B. nach meinen selbstdefinierten Tags geparst werden.
Die eingebundenen PHP-Scripte erben die intialisierten PHP-Objekte und haben damit natürlich auch Zugriff auf die Benutzerdaten.

Pingu