====== 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: 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 ===== 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'': Header add Access-Control-Allow-Origin "http://127.0.0.1:5500" (Dazu muss im Apache Webserver das Module ''headers'' aktiviert sein, was bei unserem Server gemacht wurde). 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 ===== Aufgabe ===== Bauen Sie mit diesen Angaben ein Highscore-System. 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. 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.