php content= Aufrufe beschränken?

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
mclien
Beiträge: 2427
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

php content= Aufrufe beschränken?

Beitrag von mclien » 01.02.2017 14:02:31

auf meinem shared hosting (uberspace) bastel ich gerade an einem projekt mit meinem Sohn.
Die Seite ist mit hat eine index-php, die dann mit "content=" Daten läd (primär Bilder und eine text Datei). Allrdings stelle gerade jemand fest, dass man so auch infos aufrufen kann die man direkt eingibt.
Irgendwie stehe ich aber gerade auf der Leitung wie ich das korrekt einschränke. Ich habe zwar jetzt schon gelesen, dass die Daten immer "validiert" werden sollen, bevor sie php übergeben werden.
Aber wie mache ich das technisch? Ein Liste, die die "zulässigen Verzeichnisse und Dateien enthält?
Bei Datenvalidierung und php - Suchen finde ich das Thema immer nur, wenn es um Formulare geht, die auf der website vom user gefüllt werden.

Sicher eine rudimentäre Frage, aber irgendwie finde ich nicht die richtigen Ansätze

Benutzeravatar
sbruder
Beiträge: 333
Registriert: 24.06.2016 13:54:36
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Franken

Re: php content= Aufrufe beschränken?

Beitrag von sbruder » 01.02.2017 16:05:39

Schnell zusammengefrickelt:

Code: Alles auswählen

<?php
/* public domain */
function clearInput($input) {
  // The throwaway-array defines the phrases to thow away (by default '../', beginning with '/' and beginning with '~/')
  $throwaway = array(); // Initialize the trowaway-Array
  $throwaway[] = '/\.\.\//';
  $throwaway[] = '/^\//';
  $throwaway[] = '/^~\//';
  /*
    Here you can define your own
  */
  return preg_replace($throwaway, '', $input); // replace all from the throwaway-array with nothing
}
// Example function call
echo clearInput('../../../etc/passwd');
?>
Nicht besonders schön, aber funktioniert.
Noch ein Tipp: ALLE unvertrauenswürdigen Eingaben (also alle Nutzer-Eingaben) durch htmlspecialchars() drücken. mysql_real_escape_string() kann auch nicht schaden.
EDIT: Kommentar hinzugefügt

mclien
Beiträge: 2427
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: php content= Aufrufe beschränken?

Beitrag von mclien » 01.02.2017 16:12:07

Danke Dir.
Also direkte usereingaben gibt es ja nicht. Es geht primär darum die direkte Manipulation der URL zu verhindern.

Benutzeravatar
sbruder
Beiträge: 333
Registriert: 24.06.2016 13:54:36
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Franken

Re: php content= Aufrufe beschränken?

Beitrag von sbruder » 01.02.2017 16:14:30

mclien hat geschrieben: Also direkte usereingaben gibt es ja nicht. Es geht primär darum die direkte Manipulation der URL zu verhindern.
Eine Nutzereingabe ist alles, was der Nutzer setzen kann und Du in Deinem Skript ausliest. Auch über den User-Agent kann man XSS/Code Injection machen! $_GET ist auch etwas, dass der Nutzer kontrollieren kann.

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: php content= Aufrufe beschränken?

Beitrag von thoerb » 01.02.2017 18:09:15

mclien hat geschrieben: Aber wie mache ich das technisch? Ein Liste, die die "zulässigen Verzeichnisse und Dateien enthält?
Bei Datenvalidierung und php - Suchen finde ich das Thema immer nur, wenn es um Formulare geht, die auf der website vom user gefüllt werden.
Um was geht es dir jetzt eigentlich?

Um die Validierung von Text aus Dateien? Um die Validierung von Eingaben aus der URL ($_GET)? Oder um die Zugriffskontrolle auf Dateien auf deinem Webserver?

mclien
Beiträge: 2427
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: php content= Aufrufe beschränken?

Beitrag von mclien » 01.02.2017 19:04:09

thoerb hat geschrieben:
mclien hat geschrieben: Aber wie mache ich das technisch? Ein Liste, die die "zulässigen Verzeichnisse und Dateien enthält?
Bei Datenvalidierung und php - Suchen finde ich das Thema immer nur, wenn es um Formulare geht, die auf der website vom user gefüllt werden.
Um was geht es dir jetzt eigentlich?

Um die Validierung von Text aus Dateien? Um die Validierung von Eingaben aus der URL ($_GET)? Oder um die Zugriffskontrolle auf Dateien auf deinem Webserver?
Primär um die Validierung der Eingaben aus der URL ($_GET), weil da das Problem auffiel.
Der Inhalt aus dem die Seite zusammengebaut wird sind 2 Ordner (Bild und Text), daraus wird dann jeweils die nächste Seite eines Webcomics erstellt. Und noch ein paar andere Infos. Mit sbruders function müste ich das ja auf die beabsichtigten erzeichnisse beschrönken können (.. generell verbieten und alle Ordner die auf der erlaubten Ebene liegen, aber nicht direkt Content liefern auch verbieten).
der freundliche, aber für mich erstmal nicht direkt hilfreiche Tip dazu war:

Code: Alles auswählen

allerdings sollte man generell auch noch einmal darauf achten, dass alle daten, die an phph übermittelt, vorher validiert werden

Und der obere Teil ist was ich bisher daraus glaube verstandne zu haben.

(Die Texte sind plain text und können nur on 2 Personen an die passende Stelle auf dem Webserver befördert werden. Und nur dahin über einen ssh key mit command-prefix).

Bei der Zugriffskontrolle au die Dateien meinst direkt aufdem Server nicht über die website?

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: php content= Aufrufe beschränken?

Beitrag von thoerb » 01.02.2017 20:02:26

mclien hat geschrieben: (Die Texte sind plain text und können nur on 2 Personen an die passende Stelle auf dem Webserver befördert werden. Und nur dahin über einen ssh key mit command-prefix).
Bei der Zugriffskontrolle au die Dateien meinst direkt aufdem Server nicht über die website?
Dass außer den zwei Personen niemand auf deine Textdateien zugreifen oder diese herunterladen kann. Also dass man da nicht über einen Webbrowser sondern nur über ssh dran kommt. Ich dachte das sei deine Frage gewesen.

mclien
Beiträge: 2427
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: php content= Aufrufe beschränken?

Beitrag von mclien » 01.02.2017 20:48:42

thoerb hat geschrieben:
mclien hat geschrieben: (Die Texte sind plain text und können nur on 2 Personen an die passende Stelle auf dem Webserver befördert werden. Und nur dahin über einen ssh key mit command-prefix).
Bei der Zugriffskontrolle au die Dateien meinst direkt aufdem Server nicht über die website?
Dass außer den zwei Personen niemand auf deine Textdateien zugreifen oder diese herunterladen kann. Also dass man da nicht über einen Webbrowser sondern nur über ssh dran kommt. Ich dachte das sei deine Frage gewesen.
Ach so. Sorry mit dem Vokabuöar in dem Kontext bin ich (noch) nicht so ganz vertraut.
Bei uberspace gibt es immer einen Nutzer, der in "seinem" home dann per ssh Vollzugriff hat.Und die uploads habe ich dann folgerndermaßen geregelt:
Auf meinem andern uberspace hatte ich eh schon ein horde laufen, auf dem habe ich dann die file-share Funktion mit drauf getan (die ich eh brauchte,um endlich mal eine ANtwort auf die Frage zu haben, wie man denn sonst MB-große Daten austauschet, wenn nicht per E-Mail).
Dort hat die Künstlerin der Comics dann auch einen share Bereich. Und auf meinem serer habe ich dann einen cronjob eingerichtet, der dann per ssh-keypair den rsync bewerkstelligt (und den pub-key auf dem Empfänger habe ich auf eben diesen rsync beschränkt)
HOWTO on Tomas Krenn:
https://www.thomas-krenn.com/de/wiki/Au ... %C3%A4nken

Soweit das Intermezzo. Ich denke dann mal, dass ich den Tip von sbruder mit den throwaway arrays nutzen werde.
die Option mit "mysql_real_escape_string()" brauche ich je nur/erst, wenn da tatsächlich ein mysql läuft, oder habe ich da was falsch verstanden?

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: php content= Aufrufe beschränken?

Beitrag von thoerb » 01.02.2017 21:23:48

mclien hat geschrieben:.
die Option mit "mysql_real_escape_string()" brauche ich je nur/erst, wenn da tatsächlich ein mysql läuft, oder habe ich da was falsch verstanden?
Dann solltest du aber gleich MySQLI oder PDO nutzen, die MySQL-Funktionen sind deprecated.
http://php.net/manual/de/migration55.deprecated.php

Benutzeravatar
sbruder
Beiträge: 333
Registriert: 24.06.2016 13:54:36
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Franken

Re: php content= Aufrufe beschränken?

Beitrag von sbruder » 01.02.2017 21:33:13

mclien hat geschrieben: die Option mit "mysql_real_escape_string()" brauche ich je nur/erst, wenn da tatsächlich ein mysql läuft, oder habe ich da was falsch verstanden?
Ja, die verhindert zum Beispiel was in der Art »blabla'); DROP TABLE passwords; --«. Wie thoerb schon gesagt hat, solltest Du aber PDO benutzen, weil Du dadurch schon von Haus aus mehr Sicherheit hast.

Antworten