Re-pasted README
This commit is contained in:
276
README.md
276
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).
|
Bitte **bei allen Zeilen Kommentare einfügen**, die die **Funktion der Zeile** erklären.
|
||||||
|
|
||||||
### Frage:
|
|
||||||
Welche Informationen liefert die Funktion `phpinfo();`?
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Lösung Aufgabe 1
|
### Fragen
|
||||||
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:
|
1. **Welche Informationen liefert die Funktion `phpinfo();`?**
|
||||||
```php
|
|
||||||
<?php
|
2. **PHP.ini Einstellungen** – Erkläre die jeweilige Funktion:
|
||||||
// Aktiviert die vollständige Informationsausgabe zur PHP-Umgebung
|
|
||||||
phpinfo(); // Gibt HTML mit allen PHP- und Systeminformationen aus
|
- `PHP-Fehler ausgeben`
|
||||||
?>
|
- `Speichernutzung und die Laufzeit deiner Skripte limitieren`
|
||||||
```
|
- `allow_url_fopen = off`
|
||||||
Hinweis: Nicht in Produktionsumgebungen offen stehen lassen – sensibel für Informationslecks.
|
- `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
|
#### Ziel des Programms
|
||||||
- Speichernutzung und Laufzeit deiner Skripte limitieren
|
|
||||||
- allow_url_fopen = off
|
Die Aufgabe dieses Programms ist die **Addition und Multiplikation mehrerer Zahlen** und die **Anzeige des Rechenergebnisses**.
|
||||||
- session.auto_start = off
|
Es **gibt keine Benutzerinteraktion** – die Werte sind **fest in der PHP-Datei eingetragen**.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Lösung Aufgabe 2
|
### Aufgabenstellung
|
||||||
**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:
|
Zwei Tankfüllungen:
|
||||||
```text
|
|
||||||
liter1 = 40.5
|
```
|
||||||
liter2 = 35.7
|
liter1 = 40.5
|
||||||
|
liter2 = 35.7
|
||||||
preis = 1.499
|
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
|
```php
|
||||||
<?php
|
<?php
|
||||||
$liter1 = 40.5; // Erste Tankfüllung in Litern
|
// Teil 1: Variablen definieren
|
||||||
$liter2 = 35.7; // Zweite Tankfüllung in Litern
|
$liter1 = 40.5; // Erste Tankfüllung in Litern
|
||||||
$preis = 1.499; // Preis pro Liter (EUR)
|
$liter2 = 35.7; // Zweite Tankfüllung in Litern
|
||||||
|
$preis = 1.499; // Preis pro Liter in Euro
|
||||||
|
|
||||||
$gesamtLiter = $liter1 + $liter2; // Addition der Literwerte
|
// Berechnung der Gesamtliter
|
||||||
$kostenFuellung1 = $liter1 * $preis; // Kosten der ersten Füllung
|
$gesamt_liter = $liter1 + $liter2; // Addition der beiden Tankfüllungen
|
||||||
$kostenFuellung2 = $liter2 * $preis; // Kosten der zweiten Füllung
|
|
||||||
$gesamtKosten = $gesamtLiter * $preis; // Gesamtkosten für beide
|
|
||||||
|
|
||||||
echo 'Gesamtmenge: ' . $gesamtLiter . ' L'; // Ausgabe Menge
|
// Berechnung der Gesamtkosten
|
||||||
// ... weitere formatierte Ausgaben siehe vollständige Datei
|
$kosten = $gesamt_liter * $preis; // Multiplikation mit dem Preis pro Liter
|
||||||
?>
|
|
||||||
```
|
|
||||||
Vollständiger Code siehe `test.php`.
|
|
||||||
|
|
||||||
---
|
// Teil 2: Ausgabeergebnis
|
||||||
|
echo "Die Benzinkosten betragen für " . $gesamt_liter . " Liter " . $kosten . " €";
|
||||||
## 🌐 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
|
|
||||||
<?php
|
|
||||||
// $pdo vorher sicher initialisiert (DSN, User, Passwort)
|
|
||||||
$stmt = $pdo->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)
|
## Zusatzaufgabe
|
||||||
- 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
|
|
||||||
|
|
||||||
---
|
Bitte **bei allen Zeilen Kommentare einfügen** (Funktion der Zeile).
|
||||||
|
|
||||||
## 📚 Ressourcen
|
- **Welche Informationen liefert die Funktion `phpinfo();`?**
|
||||||
- OWASP Top 10: https://owasp.org/www-project-top-ten/
|
- **PHP.ini Einstellungen – erkläre die jeweilige Funktion:**
|
||||||
- PHP Security: https://www.php.net/manual/en/security.php
|
- PHP-Fehler ausgeben
|
||||||
- Mozilla Web Security Guidelines: https://infosec.mozilla.org/guidelines/web_security
|
- Speichernutzung und Laufzeit der Skripte limitieren
|
||||||
- CWE: https://cwe.mitre.org/
|
- `allow_url_fopen = off`
|
||||||
- PHP The Right Way: https://phptherightway.com/
|
- `session.auto_start = off`
|
||||||
- Composer Security Advisories: https://github.com/FriendsOfPHP/security-advisories
|
|
||||||
|
|
||||||
---
|
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.
|
||||||
## 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.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user