diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e5b1938 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.idea +/.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index 6b19f05..841d7d4 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,29 @@ Welche Informationen liefert die Funktion `phpinfo();`? --- +## 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 + +Minimalbeispiel mit kommentierten Zeilen: +```php + +``` +Hinweis: Nicht in Produktionsumgebungen offen stehen lassen – sensibel für Informationslecks. + +--- + ## Aufgabe 2: PHP.ini-Einstellungen Erkläre die jeweilige Funktion folgender PHP.ini-Einstellungen: @@ -20,30 +43,191 @@ Erkläre die jeweilige Funktion folgender PHP.ini-Einstellungen: --- +## 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. + +**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 preis = 1.499 +``` +--- + +## Lösung Aufgabe 3 (Auszug aus `test.php`) +```php + +``` +Vollständiger Code siehe `test.php`. + +--- + +## 🌐 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 +?> +``` + +--- + +## ✅ 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 + +--- + +## 📚 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 + +--- + +## 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.