diff --git a/README.md b/README.md index ff193af..a03bf8a 100644 --- a/README.md +++ b/README.md @@ -1,233 +1,111 @@ -# PHP – Grundlagen & Übungsaufgabe +# PHP Übungsaufgabe -## Aufgabe 1: PHP-Informationsfunktion +## Aufgabenbeschreibung -**Hinweis:** Bitte bei allen Zeilen Kommentare einfügen (Funktion der Zeile). - -### Frage: -Welche Informationen liefert die Funktion `phpinfo();`? +Bitte **bei allen Zeilen Kommentare einfügen**, die die **Funktion der Zeile** erklären. --- -## Lösung Aufgabe 1 -Die Funktion `phpinfo();` gibt eine umfangreiche Übersicht über die aktuelle PHP-Laufzeitumgebung aus. Sie enthält u.a.: -- PHP-Version, Build-Datum und Compiler-Informationen -- Server-API (z. B. Apache Module Handler, FPM, CLI) -- Pfade: `Loaded Configuration File`, zusätzliche INI-Dateien -- Konfigurations-Direktiven und ihre aktuellen Werte (lokal vs. master) -- Installierte und geladene Erweiterungen (Extensions) wie mysqli, PDO, curl, openssl -- Environment-Variablen und gesetzte HTTP-Header -- Informationen zu Betriebssystem, Architektur und Thread-Sicherheit -- Module für Datenbanken, Grafik (GD), OpenSSL, Session, Mail, JSON u.v.m. -- Lizenzinformationen +### Fragen -Minimalbeispiel mit kommentierten Zeilen: -```php - -``` -Hinweis: Nicht in Produktionsumgebungen offen stehen lassen – sensibel für Informationslecks. +1. **Welche Informationen liefert die Funktion `phpinfo();`?** + +2. **PHP.ini Einstellungen** – Erkläre die jeweilige Funktion: + + - `PHP-Fehler ausgeben` + - `Speichernutzung und die Laufzeit deiner Skripte limitieren` + - `allow_url_fopen = off` + - `session.auto_start = off` --- -## Aufgabe 2: PHP.ini-Einstellungen +### Beispielwebseite in PHP -Erkläre die jeweilige Funktion folgender PHP.ini-Einstellungen: +Erstelle eine Datei mit dem Namen **`test.php`** und speichere sie im **`htdocs`**-Verzeichnis. +Starte anschließend den lokalen Server und teste das Skript. -- PHP-Fehler ausgeben -- Speichernutzung und Laufzeit deiner Skripte limitieren -- allow_url_fopen = off -- session.auto_start = off +#### Ziel des Programms + +Die Aufgabe dieses Programms ist die **Addition und Multiplikation mehrerer Zahlen** und die **Anzeige des Rechenergebnisses**. +Es **gibt keine Benutzerinteraktion** – die Werte sind **fest in der PHP-Datei eingetragen**. --- -## Lösung Aufgabe 2 -**Fehlerausgabe** -- `display_errors` (bool): Steuert, ob Fehler direkt im Browser/CLI ausgegeben werden. In Entwicklung: `On`, Produktion: `Off`. -- `error_reporting` (int): Legt fest, welche Fehlertypen gemeldet werden (z. B. `E_ALL`). -- `log_errors` (bool): Fehler ins Log schreiben statt anzeigen – wichtig für Sicherheit. +### Aufgabenstellung -**Speicher- und Laufzeitbegrenzung** -- `memory_limit` (z. B. `256M`): Maximale Menge RAM, die ein Skript nutzen darf. Verhindert Abstürze durch Überlastung. -- `max_execution_time` (Sekunden): Maximale Laufzeit eines Skripts (Standard oft 30). Schutz gegen Endlosschleifen / Hänger. -- `max_input_time`: Zeitlimit für das Parsen von Input-Daten (POST/GET). - -**Remote-File-Handling** -- `allow_url_fopen`: Erlaubt Dateifunktionen (`file_get_contents`, `fopen`) auf URL-Wrapper (http/https). `off` erhöht Sicherheit (verhindert SSRF / unerwartete externe Zugriffe). Bei Bedarf besser cURL mit Validierung nutzen. - -**Session-Verhalten** -- `session.auto_start`: Wenn `On`, startet PHP automatisch eine Session bei jedem Request – unflexibel, kann Performance und Ressourcen belasten. Mit `Off` startet man Sessions gezielt (`session_start();`). - -**Sicherheits-Implikationen (kurz):** -- Zu aggressive Fehleranzeige in Produktion = Informationsleck. -- Fehlende Limits = Risiko von Ressourcenerschöpfung (DoS). -- `allow_url_fopen` ungeprüft = Angriffsfläche für SSRF / Remote Inclusion. -- Unkontrollierte Sessions = Tracking-/Sicherheitsprobleme. - ---- - -## Aufgabe 3: Beispielwebseite in PHP - -Erstelle eine Datei mit dem Namen **`test.php`** -und kopiere sie in dein **`htdocs`**-Verzeichnis. -Führe sie anschließend im Browser aus. - -### Beschreibung -Die Aufgabe dieses Programms ist die **Addition und Multiplikation mehrerer Zahlen** -sowie die **Anzeige des Rechenergebnisses**. - -Es darf **keine Benutzerinteraktion** stattfinden – -die Werte werden **fix in der PHP-Datei** eingetragen. - -### Szenario Zwei Tankfüllungen: -```text -liter1 = 40.5 -liter2 = 35.7 + +``` +liter1 = 40.5 +liter2 = 35.7 preis = 1.499 ``` +Diese sind zu multiplizieren und als **Kosten (`kosten`)** in einem **Aussagesatz** anzuzeigen. + +#### Teil 1 – Kostenermittlung + +Berechne die **Gesamtliter** sowie die **Gesamtkosten**. + +#### Teil 2 – Ergebnisanzeige + +Erstelle eine **Zeichenkette**, die sich aus folgenden Teilen zusammensetzt: + +- Text: `"Die Benzinkosten betragen für "` +- Addition der Variablen `liter1 + liter2` +- Text: `" Liter "` +- Variable `kosten` +- Text: `" €"` + --- -## Lösung Aufgabe 3 (Auszug aus `test.php`) +### Beispielausgabe + +``` +Die Benzinkosten betragen für 76.2 Liter 114.2238 € +``` + +--- + +### Erweiterung + +Recherchiere **Dateneingabemöglichkeiten** mittels **HTML-Formularen** +(z. B. Verwendung von `POST` und `GET` Variablen in PHP). + +--- + +### Beispiel: PHP-Code-Grundgerüst + ```php -``` -Vollständiger Code siehe `test.php`. +// Berechnung der Gesamtkosten +$kosten = $gesamt_liter * $preis; // Multiplikation mit dem Preis pro Liter ---- - -## 🌐 Client-Server & HTTP-Zyklus -**HTTP Cycle:** -1. Request: Browser → Server (Methoden: GET, POST, PUT, DELETE, PATCH; Headers; Body) -2. Processing: Routing, Business-Logik, DB-Operationen -3. Response: Status-Codes (2xx, 3xx, 4xx, 5xx), Headers, Body (HTML/JSON/Assets) - -**Netzwerkschichten (vereinfacht):** -``` -App: HTTP/HTTPS, REST, GraphQL -Transport: TCP/UDP, WebSockets -Internet: IP Routing, DNS -Link: Ethernet, WiFi, 5G -``` - -**Webserver Beispiele:** Nginx (Reverse Proxy, Performance), Apache (flexibel), Caddy (Auto-HTTPS), Cloudflare Workers (Edge/Serverless) - ---- - -## 🛠️ Entwicklungsumgebung (Stack-Beispiele) -Runtime: Node.js 18+, PHP 8.1+, Python 3.11+, Docker / Podman -DB: PostgreSQL 15+, MySQL 8+ / MariaDB, Redis, MongoDB -Tools: IDE (VS Code, PhpStorm), Docker, Git, Linter, Test-Frameworks - -**Docker Compose Beispiel:** -```yaml -version: '3.8' -services: - app: - build: . - ports: - - '8080:80' - db: - image: postgres:15 - environment: - POSTGRES_DB: myapp - redis: - image: redis:7-alpine -``` -Lokale Installation (macOS/Linux): `brew/apt install nginx postgresql redis` - ---- - -## ⚠️ Sicherheitsrisiken (Auswahl) -1. Phishing – Nutzer werden auf gefälschte Seiten gelockt (Schutz: HTTPS, Schulung, DMARC) -2. Datendiebstahl – Unautorisierter Zugriff (Schutz: Zugriffskontrolle, Verschlüsselung) -3. SQL Injection – Manipulierte Eingaben verändern Queries (Schutz: Prepared Statements) -4. XSS – Eingebettete Skripte (Schutz: Output Encoding, CSP) -5. Session Hijacking – Session-Diebstahl (Schutz: Secure/HttpOnly Cookies, Regeneration) -6. DoS/DDoS – Überlastung (Schutz: Rate Limits, WAF, Caching) -7. CSRF – Ungewollte Aktionen (Schutz: CSRF-Token, SameSite Cookies) -8. File Inclusion (LFI/RFI) – Lokale/Remote Ausführung von Dateien (Schutz: Whitelists, `allow_url_fopen=off`, Pfadvalidierung) - -### Weitere Angriffsvektoren / Exploits -- Remote Code Execution (RCE) durch unsichere eval/include oder veraltete Bibliotheken -- Path Traversal (../../..) für unerlaubten Datei-Zugriff -- Insecure Direct Object Reference (IDOR) durch fehlende Autorisierung bei Ressourcen-IDs -- Unsichere Dateiuploads (Webshells) – fehlende Typ-/Inhaltsprüfung -- Insecure Deserialization – Ausführung schädlicher Objekte -- Server-Side Request Forgery (SSRF) – Ausnutzen interner Netzwerkzugriffe -- Cryptographic Weaknesses – schwache Hashes (MD5/SHA1), hartecodierte Schlüssel -- Race Conditions – Logikfehler bei paralleler Verarbeitung (z. B. doppelte Buchungen) -- Fehlkonfiguration (Default-Passwörter, offene Admin-Panels) -- Supply-Chain Angriffe – manipulierte Drittanbieter-Pakete - ---- - -## 🛡️ Schutzmaßnahmen -**Encryption:** TLS (HTTPS), Verschlüsselung ruhender Daten (Disk/DB) -**Auth:** MFA, starke Passwörter, RBAC/Least Privilege -**Validation:** Strikte Input-Validierung, Prepared Statements, Output Encoding -**Sessions:** HttpOnly + Secure Cookies, Session-Regeneration nach Login, angemessener Timeout -**Headers:** CSP, X-Frame-Options, X-Content-Type-Options, HSTS, Referrer-Policy -**Monitoring:** Logging, Audit Trails, IDS/WAF, SIEM -**Updates:** Regelmäßige Patches, Dependency-Scans (Composer Audit) -**Backup & Recovery:** Getestete Wiederherstellungsprozesse, Offline-Backups - -Beispiel Prepared Statement (PDO): -```php -prepare('SELECT * FROM users WHERE email = ?'); // Platzhalter vermeidet SQL Injection -$stmt->execute([$email]); // Binded Wert sicher -$user = $stmt->fetch(PDO::FETCH_ASSOC); // Holt Datensatz als Array +// Teil 2: Ausgabeergebnis +echo "Die Benzinkosten betragen für " . $gesamt_liter . " Liter " . $kosten . " €"; ?> ``` --- -## ✅ Best Practices (Kurzliste) -- Eingaben validieren & sanitisieren -- Prepared Statements überall für DB-Zugriffe -- HTTPS erzwingen / HSTS aktivieren -- Starke Authentifizierung (MFA, Passwortrichtlinien) -- Sicherheitsheader setzen (CSP, X-Frame-Options, etc.) -- Software & Dependencies aktuell halten -- Logging + aktives Monitoring (Anomalien) -- Least Privilege & strikte Rollen -- Regelmäßige Penetrationstests & Code Reviews -- Geplante Backups & Wiederherstellung testen +## Zusatzaufgabe ---- +Bitte **bei allen Zeilen Kommentare einfügen** (Funktion der Zeile). -## 📚 Ressourcen -- OWASP Top 10: https://owasp.org/www-project-top-ten/ -- PHP Security: https://www.php.net/manual/en/security.php -- Mozilla Web Security Guidelines: https://infosec.mozilla.org/guidelines/web_security -- CWE: https://cwe.mitre.org/ -- PHP The Right Way: https://phptherightway.com/ -- Composer Security Advisories: https://github.com/FriendsOfPHP/security-advisories +- **Welche Informationen liefert die Funktion `phpinfo();`?** +- **PHP.ini Einstellungen – erkläre die jeweilige Funktion:** + - PHP-Fehler ausgeben + - Speichernutzung und Laufzeit der Skripte limitieren + - `allow_url_fopen = off` + - `session.auto_start = off` ---- - -## Hinweise zur lokalen Ausführung -**PHP Dev-Server (falls kein Apache/Nginx konfiguriert):** -```bash -php -S localhost:8000 -``` -Dann im Browser: `http://localhost:8000/test.php` - -**Sicherheits-Hinweis:** `phpinfo()` nur temporär verwenden und danach entfernen. +Erstelle ein **HTML-Formular**, mit dem Eingabewerte für `liter1`, `liter2` und `preis` übergeben werden. +Verarbeite die Daten mit **POST oder GET** in PHP, um die Berechnung dynamisch durchzuführen.