Webspace / Direktzugriff / richtig absichern (htaccess etc)

Harald65

Cadet 1st Year
Registriert
Okt. 2023
Beiträge
12
Hallo zusammen,

wahrscheinlich gibt es dazu schon viele Fragen und auch Antworten, aber ich glaube ich schreitere bereits an der richtigen Fragestellung :D

Ich bin Hobby-Designer und betreue eine kleine Webseite einer Firma (keine Kundendaten etc auf der Seite), aber es gibt einen internen Bereich. Dort sind Bilder und Diverses Zeug zu finden.
Natürlich ist das ganze per Anmeldescript abgesichert. Die Seiten sind somit nicht aufrufbar und man wird auf die Anmeldeseite umgeleitet.
Aber wenn ich den Pfad und den Bildnamen errate, dann ist der Zugriff durchaus möglich.

Das muss man doch irgendwie unterbinden können?

Aber nach was suche ich hier genau?

  • Zugriff nur durch den lokalen PHP User ev.?
  • bin generell interessiert an Informationen wie man hier Sicherheit möglichst hoch sicherstellen kann


Danke für euere Zeit und Hilfe!

Lg
Harald
 
Ja, die Daten nicht im ROOT der Seite speichern, sondern außerhalb. Wenn Du die Daten per Deeplink aufrufen kannst ohne Authorisierung und Authentifizierung, dann solltest Du beim Designen bleiben und die Verwaltung jemandem übertragen, der was davon versteht.
 
  • Gefällt mir
Reaktionen: guzzisti
Wofür ist dann das Abmeldeskript wenn es den Zugriff nicht schützt?

htaccess oder ähnliches ist schon der richtige Weg und da gibt es Millionen Beispiele zu.

Was für ein Webserver wird überhaupt eingesetzt?
 
  • Gefällt mir
Reaktionen: redjack1000, Der Lord und Brati23
Entweder per Rewrite-Rule so lösen dass der Webserver die Bilder nicht direkt ausliefert sondern entsprechende Requests auf ein PHP-Skript gehen welches die Berechtigung dann nochmal überprüft und dann das eigentliche Bild per readfile() ausgibt (Content-Type header nicht vergessen). Hat aber Nachteile bei der Performance; Dateien ausliefern kann der Webserver zigfach schneller als PHP-Skripte ausführen, während der Übertragung des Bildes ist ein PHP-Worker blockiert (außer man benutzt sowas wie X-Accel) und für jedes Bild werden vermutlich mehrere Datenbankabfragen gemacht um das Session Cookie und die Berechtigungen zu validieren.

Einfacher geht es wenn man dafür sorgt dass die Dateinamen nicht mehr erraten werden können, z.B. in dem man die Bilder bin2hex(random_bytes(16)) . ".jpg" nennt. Oder wenn man die Dateinamen für den Download erhalten will jedes Bild in einen eigenen Ordner mit zufälligem Namen legen. Dann musst du nur in dem Skript für deine Seite überprüfen welche/ob dieser Account Bilder sehen darf und mit dem Link bekommt der Browser direkt das "Passwort" für das Bild. Beim Übertragen der Bilder muss dann nichts mehr überprüft werden weil Kennt Dateiname == Hat Zugriffsrecht. Natürlich könnten Nutzer den Link jetzt einfach an Unbefugte weitergeben, aber sie könnten das Bild sowieso auch einfach speichern oder screenshotten.
 
Hallo zusammen!

Danke für die Antworten!

dann solltest Du beim Designen bleiben

Aber dann lerne ich ja nicht dazu ;)

Ja, die Daten nicht im ROOT der Seite speichern, sondern außerhalb

Wenn ich das nun richtig verstehe, dann sollten alle PHP Dateien im ROOT und folgenden Unterordnern liegen (PHP Dateien sind ja durch das Anmelde-Script gesichert)

Also in diese Richtung?:
- root (index.php, ...)
-- Unterordner: php Daten
-- Unterordner: js Daten
-- Unterordner: css Daten
- Bilder

Wofür ist dann das Abmeldeskript wenn es den Zugriff nicht schützt?

Schützt die Information der Ausgabe in der php-Datei? User = ja dann Text, User nein, dann nichts?

Fraglich ist aber, ob da nicht zb ein Hosted Nextcloud vernünftiger wäre.

Ist ja nicht so, dass ich lokal einen Webserver betreibe, es ist ausgelagert. Es wird der Webspace, Domain, etc... bereitgestellt. Aber wenn es bei mir schon falsch erstellt wird, weil ich keinen Plan habe (bei mir liegt momentan alles im Root, auch die Unterordner mit den Bildern) dann liegt es wohl an mir, dann hilft doch das Auslagern nichts, weil bei mir der Fehler liegt.

Wie gesagt, ich möchte es gerne lernen, bzw. wissen worauf ich achten muss und in welche Richtung ich Informationen einholen muss :)

Danke!

Lg
 
Harald65 schrieb:
Wenn ich das nun richtig verstehe, dann sollten alle PHP Dateien im ROOT und folgenden Unterordnern liegen (PHP Dateien sind ja durch das Anmelde-Script gesichert)
Nein. Normalerweise macht man ein Verzeichnis public, dass den ROOT der Webseite repräsentiert und ein Verzeichnis library, wo der PHP-Code drin liegt. Beispiel:

Code:
public/
+ index.php
+ css/
+ js/
+ img/
library/MyCompany/
+ Database.php
+ ...
images/
+ restricted/my-internal-image.jpg

Im ROOT / public liegen also nur Dateien für alle verfügbar, alles andere liegt außerhalb von public. Die index.php kümmert sich dann um die includes und das "auslesen" der Bilder aus den internen Verzeichnissen via session / Authentifizierung.
 
  • Gefällt mir
Reaktionen: Marco01_809
Vielen Dank an netzgestaltung und sandreas für die nützlichen Infos!
Dann werde ich mich dahingehend weiter informieren und Verbesserungen an der Seite vornehmen :D

Danke!!
 
Wenn die Webseite bei einem Hoster liegt bzw. es ein grafisches Verwaltungstools gibt, dann ist dort sicherlich auch eine Option um einen Ordner mit username + passwort zu schützen.
 
Ich habe nur einen FTP, sowie PHP-Admin, SQL, ... Zugänge. Direkteren Zugriff habe ich nicht auf den Server.

via session / Authentifizierung.

wäre es zu viel des Guten, wenn ich mir hier eine bisschen detailliertere Ausführung wünschen würde um es mit meinem löchrigen "Wissen" abgleichen zu können? Zur Kontrolle ob meine Umsetzung grob dem entspricht wie es richtig gemacht werden sollte?

Danke!

Lg
 
Nein, aber: Du kannst dazu Details nennen, wie die derzeitige Authentifizierung genau umgesetzt ist.
Es gibt verschiedene PHP-Libs, die entweder alles oder Teile deiner Anforderungen abdecken.
  • Session/Login
  • DB
  • Upload/Download/Files-View
  • Share/Permissions/User/Groups

oder alles in einem, zb:
https://github.com/rail5/SimpleFS oder eben Nextcloud

oder es gibt PHP-Frameworks(zb Zend, Symfony) die alle diese Module bieten

Dabei gibt es einige Sicherheitsstolperfallen und da Beispiele zu geben hängt davon ab, wie du das organisieren willst.

Wichtig bei Drittanbieter-Abhängigkeiten ist die Recherche, wie Updates funktionieren und ob es überhaupt regelmäßige gibt und wie einfach sich die einspielen lassen.
 
Alles Marke Eigenbau 😇

Ich prüfe die Session-Variablen ob bestimmte Einträge den Vorgaben entsprechen, sonst wird auf das Anmeldeformular umgeleitet.
Das Login-Formular prüft ob es zu den Eingaben einen Eintrag in der DB gibt.
Wenn die Eingaben übereinstimmen schreibe ich das ganze in die Session-Variablen.

Die Session "File" liegt so weit mir bekannt ja am Server und kann noch draußen nicht bearbeitet werden (also nicht wie ein Cookie)

Bei jedem Aufruf wird dann geprüft ob Session-Name gesetzt ist und einen bestimmten Wert enthält.
Sollt der Wert richtig sein hat man Zugriff, falls nicht, dann zurück zum Start.

Es gibt keine Unterscheidung in diverse Berechtigungsgruppen.

Wahrscheinlich stellt es nun den meisten die Haare auf :D

So viele Wissenslücken kommen wohl daher, dass ich mit "Hello World" einfach mal drauf los gebastelt habe und Bedenken im Bezug auf Deeplinks etc. erst sehr sehr spät kamen.
Die oben Aufgezeigte Struktur mit Root public ... ist mir so nie unter und somit auch nicht in den Sinn gekommen.
Alleine diese Umstellung wird nun etwas an Arbeitsaufwand bedeuten^^

Aber ich bin Dankbar für die Hilfe!

Lg
 
Harald65 schrieb:
So viele Wissenslücken kommen wohl daher, dass ich mit "Hello World" einfach mal drauf los gebastelt habe und Bedenken im Bezug auf Deeplinks etc. erst sehr sehr spät kamen.
An sich spricht nix dagegen. Aber mit den Wissenslücken dann einen Server im Internet zu betreiben, ist bestenfalls riskant, schlimmstenfalls ziehst du halt andere Leute mit rein, die dein System nutzen. Wenn dein Server "gehackt" wird und Daten abfließen, wird es eben auch rechtlich problematisch.
 
nein nein, nicht falsch verstehen, ich betreibe keinen Server, nur ein Webseite auf der auch nicht viel interaktion der User möglich ist.
mir ist klar, dass ein name und das Geburtsdatum sensible Daten sind, aber eine Geburtstagsliste das somit die persönlicheste Info die zu finden ist.
Ansonsten ist es eine Art Notizzettel und ein paar Bilder von Grillfeiern etc.

Aber auch das möchte ich natürlich nicht "frei" ins Netz stellen, auch wenn unproblematisch.

Aber durch deine / eure Hilfe lerne ich dazu und werde auch das möglichst sicher machen, ev. mache ich ja einmal eine Seite wo es wichtig ist.
 
  • Gefällt mir
Reaktionen: netzgestaltung
Ganz ehrlich, auch wenn das vielen nicht gefallen wird ... mir auch nicht so recht :-) aber mach dir nen chat GPT 4 Konto auf und frage die Maschine. Da bekommst du sofort Antworten und du kannst Teile deines Codes direkt begutachten lassen.

Wenn du es richtig anstellst, erklärt dir CGPT auch warum du was machen solltest und was besser nicht. Mit direkten Verbesserungsvorschlägen. Geht auch auf Deutsch :-)

Ohne Mist, bessere Ratschläge bekommst du auch nicht aus Foren, vor allem weil keiner dein Projekt kennt und was du da bastelst.
 
ich würde alternativ vorschlagen, ein github oder gitlab repo zu starten und den link zu posten. dann kann jeder reinschauen.
 
Input => Output

Und der Input seitens des TE ist einfach nur schlecht. Keine ausreichenden und relevanten Informationen. Und das hat nichts mit Programmieren zu tun. Das sind grundlegende Kommunikationsfähigkeiten an denen es scheitert.
 
Für GPT 4 hats leider noch nicht gereicht ;)
Die Kommentare helfen sehr den Code zu verstehen und zu lernen, aber oft mit veralteten Funktionen.
Hilft trotzdem sehr weiter!

Da kommt dann wahrscheinlich das Kommunikationsproblem ins Spiel, da ich nicht wirklich weiß nach was ich fragen oder suchen soll :)
mal davon abgesehen will sicher niemand einen fremden Code auf Fehler durchforsten, besonders wenn der Code von einem Neuling verfasst wurde und sicher wesentlich effizienter gehen würde :freak:

Fragt man nach der Sicherheit kommen immer die selben Punkte wie htaccess oder SQL Injection ...

Aber das mit der Ordnerstruktur war mir bisher einfach unbekannt, daher auch keine Gedanken in diese Richtung.

Wenn ich nun umbaue auf:
+root
++public
+++index.php
+++css
+++js
+intern
++PHP-Daten

Der richtige Weg ist nun per "include" die Files aufzurufen, wie sandreas geschrieben hat.
Aber, wenn ich nun so über den Aufbau der index.php nachdenke bin ich leider auch etwas ratlos wie der richtige Weg ist. Sehe schon eine komplizierte Struktur und einige Zeit später habe ich wieder einen AHA-Moment und baue wieder alles um :cool_alt:


PHP:
include "../intern/test.php";

Folgendes wird weder sicher sein und auch nicht funktionieren?

HTML:
<a href="../intern/test.php">

einmal im Internen Bereich angelagt muss ich wahrscheinlich weiter alles mit "include" lösen und nicht wieder auf "links" zurückfallen?

Danke für euren Input, auch wenn meine Fragen und Kommunikation sicher dürftig ist.

Lg
 
Harald65 schrieb:
mal davon abgesehen will sicher niemand einen fremden Code auf Fehler durchforsten
Dazu machst du Abstraktionen. Kopier das Projekt, nimm alles raus, was für die eine Frage nicht nötig ist und poste nur den relevanten Teil(oder mach auf Github ein Issue mit link zur Zeile). Du wirst sehen, dass es dann einfacher ist, Hilfe zu erhalten und du kannst das Projekt auch nach und nach einfacher strukturieren, so dass es irgendwann "einarbeitbar" wird.
 
Zurück
Oben