lehrkraefte:blc:informatik:ffprg2-2023:serverfileio

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
lehrkraefte:blc:informatik:ffprg2-2023:serverfileio [2023/08/28 06:27] – created Ivo Blöchligerlehrkraefte:blc:informatik:ffprg2-2023:serverfileio [2023/08/28 13:50] (current) – [Aufgabe] Ivo Blöchliger
Line 1: Line 1:
 +====== Eine Datei auf dem Server mit PHP schreiben und lesen ======
 +===== Technische Voraussetzungen =====
 +  * PHP muss auf dem Webserver konfiguriert sein.
 +  * Der Benutzer des Webservers (www-data) muss die Erlaubnis haben, in ein bestimmtes Verzeichnis zu schreiben.
 +  * Das Vezeichnis sollte vor direktem Webzugriff geschützt sein.
 +
 +===== Vorbereitung =====
 +Damit der Webserver Zugriff hat, kann man als Benutzer Schreibrechte für alle auf ein Verzeichnis geben, oder der Administrator kann ein Verzeichnis anlegen, auf das www-data Schreibrechte hat.
 +
 +Damit der Webserver aber keine Datei darin direkt ausliefert, wurde darin die Datei ''.htaccess'' mit folgendem Inhalt angelegt:
 +
 +  Order deny,allow
 +  deny from all
 +
 +Das wurde mir folgendem bash-script erledigt:
 +<code bash>
 +set -x
 +user=$1
 +home=`eval echo ~$user`
 +data=$home/www-data-dir
 +mkdir -p $data
 +echo -e "Order deny,allow\ndeny from all" > $data/.htaccess
 +chown -R $user:www-data $data
 +chmod g+rwx $data
 +</code>
 +
 +
 +===== Minimalbeispiel in PHP =====
 +Kopieren Sie den Ordner ''simple-file-io'' vom Archiv https://ofi.tech-lab.ch/2023/teach/76f5054a/simple-file-io.zip in Ihr Homeverzeichnis auf dem Webserver.
 +
 +Testen Sie den Code online und studieren Sie den PHP-Code in den PHP-Dateien.
 +
 +
 +
 +===== HTTP GET =====
 +Bei einem Zugriff auf einen Webserver mit der GET-Methode werden alle Parameter in der URL gespeichert 
 +([[https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL|Bildquelle]]):
 +
 +{{:lehrkraefte:blc:informatik:ffprg2-2023:pasted:20230828-135713.png}}
 +
 +Diese Parameter können in PHP im Objekt ''$_GET'' ausgelesen werden.
 +
 +Im Gegensatz dazu können Daten mit HTTP POST direkt zum Server gesandt werden, die nicht in der URL erscheinen. Dies ist z.B. absolut nötig für vertrauliche Information, wie z.B. Passwörter etc.
 +
 +===== URL in JavaScript bauen und darauf zugreifen =====
 +Beispiel-Code: https://ofi.tech-lab.ch/2023/teach/76f5054a/simple-ajax-get-request.zip
 +==== CORS (Cross origin resource sharing) ====
 +Szenario: Der Live-Server auf ''localhost'' möchte per ''XMLHttpRequest'' auf ''ofi.tech-lab.ch'' zugreifen.
 +
 +Das schlägt fehl, der Browser unterbindet aus Sicherheitsgründen solche Requests. Wenn aber der ''ofi.tech-lab.ch''-Server dem ''localhost'', bzw. ''127.0.0.1'' die Erlaubnis für den Zugriff erteilt, funktioniert das.
 +Dazu deponieren Sie im Verzeichnis, wo die aufgerufene URL liegt folgenden Inhalt in die Datei ''.htaccess'':
 +<code txt>
 +Header add Access-Control-Allow-Origin "http://127.0.0.1:5500"
 +</code>
 +(Dazu muss im Apache Webserver das Module ''headers'' aktiviert sein, was bei unserem Server gemacht wurde).
 +
 +<hidden multiple origins>
 +Es darf nur ein header Access-Control-Allow-Origin definiert sein. Sollen mehrere Origins erlaubt sein, ist folgender Trick eine Lösung:
 +
 +https://gist.github.com/brianlmoon/2291111c5c69252c85f4
 +</hidden>
 +
 +===== Aufgabe =====
 +Bauen Sie mit diesen Angaben ein Highscore-System.
 +
 +<WRAP todo>
 +Der einfachheithalber sollen die gesamten Daten geladen werden. Wird ein neues Highscore eingefügt, wird die ganze Liste an der Server gesendet und dort gespeichert.
 +
 +Das ist natürlich problematisch, weil die ganze Liste so sehr einfach manipuliert werden könnte.
 +</WRAP>
 +
 +<WRAP todo>
 +Etwas bessere Variante: Beim Speichern soll nur noch Name und Score an den Server übermittelt werden. 
 +Das PHP-Script auf der Serverseite fügt die Daten dann allenfalls selbst in die Liste ein.
 +
 +Das System kann so zwar immer noch sehr einfach manipuliert werden, aber andere Einträge können so nicht manipuliert werden.
 +</WRAP>
 +