Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Interner Bereich mit verschiedenen Zugriffsrechten?

  1. #1
    Registrierter Benutzer Avatar von Tobias_Baus
    Registriert seit
    25.12.2004
    Ort
    Schiffweiler
    Beiträge
    18

    Interner Bereich mit verschiedenen Zugriffsrechten?

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    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
    Geändert von Pingu (24-02-2006 um 09:46 Uhr)
    Homepage: www.pingu.info

  3. #3
    Registrierter Benutzer Avatar von Tobias_Baus
    Registriert seit
    25.12.2004
    Ort
    Schiffweiler
    Beiträge
    18
    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!

  4. #4
    Registrierter Benutzer
    Registriert seit
    25.12.2004
    Beiträge
    217
    Zitat Zitat von Tobias_Baus
    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

  5. #5
    Registrierter Benutzer Avatar von Tobias_Baus
    Registriert seit
    25.12.2004
    Ort
    Schiffweiler
    Beiträge
    18
    Zitat Zitat von nEox
    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.

  6. #6
    Registrierter Benutzer
    Registriert seit
    25.12.2004
    Beiträge
    217
    Zitat Zitat von Tobias_Baus
    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" 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:
    Code:
    php_value auto_prepend_file /path/prepend.php
    Grüße,
    nEox
    Geändert von nEox (27-02-2006 um 21:40 Uhr)

  7. #7
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    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:
    Code:
    ## 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
    Homepage: www.pingu.info

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •