- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
586 lines
16 KiB
Markdown
586 lines
16 KiB
Markdown
# Sicherheits-Anleitung
|
|
|
|
Diese Anleitung erklärt die Sicherheitsfunktionen des Frameworks und wie Sie sie effektiv nutzen können, um Ihre Anwendung zu schützen.
|
|
|
|
## Überblick über die Sicherheitsarchitektur
|
|
|
|
Das Framework bietet eine mehrschichtige Sicherheitsarchitektur, die verschiedene Schutzmaßnahmen auf verschiedenen Ebenen implementiert:
|
|
|
|
1. **Eingabevalidierung**: Validierung aller Benutzereingaben, um Injection-Angriffe zu verhindern.
|
|
2. **Ausgabebereinigung**: Automatische Bereinigung von Ausgaben, um Cross-Site Scripting (XSS) zu verhindern.
|
|
3. **CSRF-Schutz**: Schutz vor Cross-Site Request Forgery.
|
|
4. **Authentifizierung**: Flexible Authentifizierungsmechanismen.
|
|
5. **Autorisierung**: Rollenbasierte und fähigkeitsbasierte Zugriffskontrolle.
|
|
6. **Web Application Firewall (WAF)**: Integrierte WAF zum Schutz vor gängigen Angriffen.
|
|
7. **Sicherheitsheader**: Automatische Konfiguration von Sicherheitsheadern.
|
|
8. **Sichere Konfiguration**: Sichere Standardeinstellungen und Best Practices.
|
|
|
|
## Eingabevalidierung
|
|
|
|
Die Eingabevalidierung ist die erste Verteidigungslinie gegen Injection-Angriffe. Das Framework bietet ein leistungsstarkes Validierungssystem, das in der [Validierungs-Anleitung](validation.md) ausführlich beschrieben wird.
|
|
|
|
### Beispiel für die Validierung von Benutzereingaben
|
|
|
|
```php
|
|
public function store(Request $request): Response
|
|
{
|
|
$this->validate($request, [
|
|
'name' => 'required|string|max:255',
|
|
'email' => 'required|email|unique:users,email',
|
|
'password' => 'required|string|min:8',
|
|
'website' => 'nullable|url',
|
|
'age' => 'nullable|integer|min:18',
|
|
]);
|
|
|
|
// Die Validierung wurde bestanden, fahren Sie mit der Speicherung fort
|
|
$user = User::create($request->only(['name', 'email', 'password']));
|
|
|
|
return $this->redirect('/users')->with('success', 'Benutzer erstellt');
|
|
}
|
|
```
|
|
|
|
### Schutz vor SQL-Injection
|
|
|
|
Das Framework verwendet parametrisierte Abfragen und Prepared Statements, um SQL-Injection-Angriffe zu verhindern:
|
|
|
|
```php
|
|
// Sicher: Verwendung von parametrisierten Abfragen
|
|
$users = DB::table('users')
|
|
->where('email', $request->input('email'))
|
|
->get();
|
|
|
|
// Sicher: Verwendung des Query Builders
|
|
$users = User::where('email', $request->input('email'))->get();
|
|
|
|
// Sicher: Verwendung von Prepared Statements
|
|
$statement = DB::prepare('SELECT * FROM users WHERE email = ?');
|
|
$statement->execute([$request->input('email')]);
|
|
$users = $statement->fetchAll();
|
|
```
|
|
|
|
## Ausgabebereinigung
|
|
|
|
### Automatische Bereinigung in Views
|
|
|
|
Das Framework bereinigt automatisch alle Ausgaben in Views, um XSS-Angriffe zu verhindern:
|
|
|
|
```php
|
|
<!-- Sicher: Automatische Bereinigung -->
|
|
<div><?= $user->name ?></div>
|
|
|
|
<!-- Unsicher: Rohe Ausgabe ohne Bereinigung (nur verwenden, wenn Sie sicher sind, dass der Inhalt vertrauenswürdig ist) -->
|
|
<div><?= raw($user->html_content) ?></div>
|
|
```
|
|
|
|
### Manuelle Bereinigung
|
|
|
|
Sie können auch manuell Daten bereinigen:
|
|
|
|
```php
|
|
use App\Framework\Security\Sanitizer;
|
|
|
|
// Text bereinigen
|
|
$cleanText = Sanitizer::clean($input);
|
|
|
|
// HTML bereinigen (entfernt gefährliche Tags und Attribute)
|
|
$cleanHtml = Sanitizer::cleanHtml($input);
|
|
|
|
// URL bereinigen
|
|
$cleanUrl = Sanitizer::cleanUrl($input);
|
|
```
|
|
|
|
## CSRF-Schutz
|
|
|
|
Das Framework bietet automatischen Schutz vor Cross-Site Request Forgery (CSRF) für alle Formulare und AJAX-Anfragen.
|
|
|
|
### CSRF-Token in Formularen
|
|
|
|
```php
|
|
<form method="POST" action="/users">
|
|
<?= csrf_field() ?>
|
|
<input type="text" name="name">
|
|
<button type="submit">Speichern</button>
|
|
</form>
|
|
```
|
|
|
|
Die `csrf_field()`-Funktion generiert ein verstecktes Eingabefeld mit einem CSRF-Token:
|
|
|
|
```html
|
|
<input type="hidden" name="_token" value="random-token-here">
|
|
```
|
|
|
|
### CSRF-Token in AJAX-Anfragen
|
|
|
|
```javascript
|
|
// Mit jQuery
|
|
$.ajax({
|
|
url: '/users',
|
|
type: 'POST',
|
|
data: {
|
|
name: 'John Doe',
|
|
_token: '<?= csrf_token() ?>'
|
|
}
|
|
});
|
|
|
|
// Mit Fetch API
|
|
fetch('/users', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-CSRF-TOKEN': '<?= csrf_token() ?>'
|
|
},
|
|
body: JSON.stringify({
|
|
name: 'John Doe'
|
|
})
|
|
});
|
|
```
|
|
|
|
### CSRF-Schutz deaktivieren
|
|
|
|
In einigen Fällen, wie z.B. bei API-Endpunkten, möchten Sie möglicherweise den CSRF-Schutz deaktivieren:
|
|
|
|
```php
|
|
// In der Middleware-Konfiguration
|
|
$middleware->except([
|
|
CsrfMiddleware::class => [
|
|
'/api/*'
|
|
]
|
|
]);
|
|
```
|
|
|
|
## Authentifizierung
|
|
|
|
Das Framework bietet ein flexibles Authentifizierungssystem, das verschiedene Authentifizierungsmethoden unterstützt.
|
|
|
|
### Benutzerauthentifizierung
|
|
|
|
```php
|
|
use App\Framework\Auth\Auth;
|
|
|
|
class LoginController extends Controller
|
|
{
|
|
public function login(Request $request): Response
|
|
{
|
|
$this->validate($request, [
|
|
'email' => 'required|email',
|
|
'password' => 'required|string',
|
|
]);
|
|
|
|
$credentials = $request->only(['email', 'password']);
|
|
$remember = $request->input('remember', false);
|
|
|
|
if (Auth::attempt($credentials, $remember)) {
|
|
return $this->redirect('/dashboard');
|
|
}
|
|
|
|
return $this->back()->withErrors([
|
|
'email' => 'Die angegebenen Anmeldeinformationen sind ungültig.',
|
|
]);
|
|
}
|
|
|
|
public function logout(): Response
|
|
{
|
|
Auth::logout();
|
|
|
|
return $this->redirect('/');
|
|
}
|
|
}
|
|
```
|
|
|
|
### Zugriff auf den authentifizierten Benutzer
|
|
|
|
```php
|
|
// Prüfen, ob ein Benutzer angemeldet ist
|
|
if (Auth::check()) {
|
|
// Benutzer ist angemeldet
|
|
}
|
|
|
|
// Aktuellen Benutzer abrufen
|
|
$user = Auth::user();
|
|
|
|
// Benutzer-ID abrufen
|
|
$userId = Auth::id();
|
|
```
|
|
|
|
### Passwort-Hashing
|
|
|
|
Das Framework verwendet automatisch sichere Passwort-Hashing-Algorithmen:
|
|
|
|
```php
|
|
use App\Framework\Security\Hash;
|
|
|
|
// Passwort hashen
|
|
$hashedPassword = Hash::make('password');
|
|
|
|
// Passwort überprüfen
|
|
if (Hash::check('password', $hashedPassword)) {
|
|
// Passwort ist korrekt
|
|
}
|
|
|
|
// Prüfen, ob ein Passwort neu gehasht werden muss
|
|
if (Hash::needsRehash($hashedPassword)) {
|
|
$hashedPassword = Hash::make('password');
|
|
}
|
|
```
|
|
|
|
### Passwort-Zurücksetzung
|
|
|
|
Das Framework bietet auch Unterstützung für die Passwort-Zurücksetzung:
|
|
|
|
```php
|
|
use App\Framework\Auth\Password;
|
|
|
|
// Token für die Passwort-Zurücksetzung erstellen
|
|
$token = Password::createToken($user);
|
|
|
|
// E-Mail mit dem Token senden
|
|
Mail::send('emails.reset-password', [
|
|
'token' => $token,
|
|
'user' => $user
|
|
], function ($message) use ($user) {
|
|
$message->to($user->email);
|
|
$message->subject('Passwort zurücksetzen');
|
|
});
|
|
|
|
// Token überprüfen und Passwort zurücksetzen
|
|
$status = Password::reset($request->only(
|
|
'email', 'password', 'password_confirmation', 'token'
|
|
), function ($user, $password) {
|
|
$user->password = Hash::make($password);
|
|
$user->save();
|
|
});
|
|
```
|
|
|
|
## Autorisierung
|
|
|
|
Das Framework bietet ein leistungsstarkes Autorisierungssystem, das rollenbasierte und fähigkeitsbasierte Zugriffskontrolle unterstützt.
|
|
|
|
### Rollenbasierte Zugriffskontrolle
|
|
|
|
```php
|
|
use App\Framework\Auth\Auth;
|
|
|
|
// Prüfen, ob der Benutzer eine bestimmte Rolle hat
|
|
if (Auth::user()->hasRole('admin')) {
|
|
// Benutzer ist ein Administrator
|
|
}
|
|
|
|
// Prüfen, ob der Benutzer eine von mehreren Rollen hat
|
|
if (Auth::user()->hasAnyRole(['admin', 'editor'])) {
|
|
// Benutzer ist entweder Administrator oder Editor
|
|
}
|
|
|
|
// Prüfen, ob der Benutzer alle angegebenen Rollen hat
|
|
if (Auth::user()->hasAllRoles(['admin', 'editor'])) {
|
|
// Benutzer ist sowohl Administrator als auch Editor
|
|
}
|
|
```
|
|
|
|
### Fähigkeitsbasierte Zugriffskontrolle
|
|
|
|
```php
|
|
use App\Framework\Auth\Auth;
|
|
|
|
// Prüfen, ob der Benutzer eine bestimmte Fähigkeit hat
|
|
if (Auth::user()->can('edit-post', $post)) {
|
|
// Benutzer kann den Beitrag bearbeiten
|
|
}
|
|
|
|
// Prüfen, ob der Benutzer eine Fähigkeit nicht hat
|
|
if (Auth::user()->cannot('delete-post', $post)) {
|
|
// Benutzer kann den Beitrag nicht löschen
|
|
}
|
|
|
|
// Autorisierung erzwingen (wirft eine Exception, wenn nicht autorisiert)
|
|
Auth::user()->authorize('edit-post', $post);
|
|
```
|
|
|
|
### Richtlinien definieren
|
|
|
|
Sie können Autorisierungsrichtlinien definieren, um komplexe Autorisierungslogik zu kapseln:
|
|
|
|
```php
|
|
use App\Framework\Auth\Policy;
|
|
|
|
class PostPolicy extends Policy
|
|
{
|
|
public function view(User $user, Post $post): bool
|
|
{
|
|
return true; // Jeder kann Beiträge sehen
|
|
}
|
|
|
|
public function create(User $user): bool
|
|
{
|
|
return $user->hasRole('writer');
|
|
}
|
|
|
|
public function update(User $user, Post $post): bool
|
|
{
|
|
return $user->id === $post->user_id || $user->hasRole('editor');
|
|
}
|
|
|
|
public function delete(User $user, Post $post): bool
|
|
{
|
|
return $user->id === $post->user_id || $user->hasRole('admin');
|
|
}
|
|
}
|
|
```
|
|
|
|
Registrieren Sie die Richtlinie:
|
|
|
|
```php
|
|
use App\Framework\Auth\Gate;
|
|
|
|
// In der Bootstrap-Datei
|
|
Gate::policy(Post::class, PostPolicy::class);
|
|
```
|
|
|
|
Verwenden Sie die Richtlinie:
|
|
|
|
```php
|
|
if (Auth::user()->can('update', $post)) {
|
|
// Benutzer kann den Beitrag aktualisieren
|
|
}
|
|
```
|
|
|
|
### Autorisierung in Controllern
|
|
|
|
Sie können die Autorisierung auch direkt in Controllern verwenden:
|
|
|
|
```php
|
|
public function update(Request $request, int $id): Response
|
|
{
|
|
$post = Post::find($id);
|
|
|
|
if (!$post) {
|
|
return $this->notFound('Beitrag nicht gefunden');
|
|
}
|
|
|
|
$this->authorize('update', $post);
|
|
|
|
// Beitrag aktualisieren
|
|
|
|
return $this->redirect('/posts')->with('success', 'Beitrag aktualisiert');
|
|
}
|
|
```
|
|
|
|
## Web Application Firewall (WAF)
|
|
|
|
Das Framework enthält eine integrierte Web Application Firewall (WAF), die Ihre Anwendung vor gängigen Angriffen schützt.
|
|
|
|
### WAF-Konfiguration
|
|
|
|
Die WAF ist standardmäßig aktiviert und kann in der Konfigurationsdatei `config/security.php` konfiguriert werden:
|
|
|
|
```php
|
|
return [
|
|
'waf' => [
|
|
'enabled' => true,
|
|
'rules' => [
|
|
'sql_injection' => true,
|
|
'xss' => true,
|
|
'command_injection' => true,
|
|
'path_traversal' => true,
|
|
'request_validation' => true,
|
|
],
|
|
'whitelist' => [
|
|
'ip' => [
|
|
'127.0.0.1',
|
|
'::1',
|
|
],
|
|
'paths' => [
|
|
'/api/webhook',
|
|
],
|
|
],
|
|
'blacklist' => [
|
|
'ip' => [
|
|
// Blockierte IP-Adressen
|
|
],
|
|
'user_agents' => [
|
|
'Bad Bot',
|
|
],
|
|
],
|
|
'rate_limiting' => [
|
|
'enabled' => true,
|
|
'max_requests' => 100,
|
|
'time_window' => 60, // Sekunden
|
|
],
|
|
],
|
|
];
|
|
```
|
|
|
|
### Maschinelles Lernen für die Angriffserkennung
|
|
|
|
Die WAF verwendet auch maschinelles Lernen, um Anomalien zu erkennen und potenzielle Angriffe zu identifizieren:
|
|
|
|
```php
|
|
use App\Framework\Waf\MachineLearning\MachineLearningEngine;
|
|
|
|
// In einem Controller oder Service
|
|
$mlEngine = $this->container->get(MachineLearningEngine::class);
|
|
$anomalyScore = $mlEngine->detectAnomalies($request);
|
|
|
|
if ($anomalyScore > 0.8) {
|
|
// Verdächtige Anfrage protokollieren oder blockieren
|
|
$this->logger->warning('Verdächtige Anfrage erkannt', [
|
|
'ip' => $request->ip(),
|
|
'path' => $request->path(),
|
|
'score' => $anomalyScore,
|
|
]);
|
|
}
|
|
```
|
|
|
|
## Sicherheitsheader
|
|
|
|
Das Framework konfiguriert automatisch wichtige Sicherheitsheader, um Ihre Anwendung zu schützen.
|
|
|
|
### Content Security Policy (CSP)
|
|
|
|
Die Content Security Policy schützt vor XSS-Angriffen, indem sie kontrolliert, welche Ressourcen geladen werden dürfen:
|
|
|
|
```php
|
|
use App\Framework\Security\ContentSecurityPolicy;
|
|
|
|
// In einem Middleware oder Controller
|
|
$csp = new ContentSecurityPolicy();
|
|
$csp->setDefaultSrc(['self'])
|
|
->setScriptSrc(['self', 'trusted-scripts.com'])
|
|
->setStyleSrc(['self', 'trusted-styles.com'])
|
|
->setImgSrc(['self', 'trusted-images.com'])
|
|
->setFontSrc(['self', 'trusted-fonts.com'])
|
|
->setConnectSrc(['self', 'api.trusted-domain.com'])
|
|
->setFrameSrc(['none'])
|
|
->setObjectSrc(['none'])
|
|
->setReportUri('/csp-report');
|
|
|
|
$response->headers->set('Content-Security-Policy', $csp->compile());
|
|
```
|
|
|
|
### Andere Sicherheitsheader
|
|
|
|
Das Framework setzt auch andere wichtige Sicherheitsheader:
|
|
|
|
```php
|
|
// In einem Middleware oder Controller
|
|
$response->headers->set('X-Content-Type-Options', 'nosniff');
|
|
$response->headers->set('X-Frame-Options', 'DENY');
|
|
$response->headers->set('X-XSS-Protection', '1; mode=block');
|
|
$response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin');
|
|
$response->headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
|
|
```
|
|
|
|
## Sichere Konfiguration
|
|
|
|
### HTTPS erzwingen
|
|
|
|
Sie können HTTPS für Ihre Anwendung erzwingen:
|
|
|
|
```php
|
|
// In der Middleware-Konfiguration
|
|
$middleware->add(HttpsMiddleware::class);
|
|
```
|
|
|
|
### Sichere Cookies
|
|
|
|
Das Framework konfiguriert automatisch sichere Cookies:
|
|
|
|
```php
|
|
// In der Konfigurationsdatei config/session.php
|
|
return [
|
|
'cookie' => [
|
|
'secure' => true,
|
|
'http_only' => true,
|
|
'same_site' => 'lax',
|
|
],
|
|
];
|
|
```
|
|
|
|
### Sichere Datei-Uploads
|
|
|
|
Das Framework bietet Funktionen für sichere Datei-Uploads:
|
|
|
|
```php
|
|
use App\Framework\Security\FileValidator;
|
|
|
|
// In einem Controller
|
|
$this->validate($request, [
|
|
'document' => 'required|file|mimes:pdf,doc,docx|max:10240',
|
|
]);
|
|
|
|
$file = $request->file('document');
|
|
|
|
// Zusätzliche Sicherheitsvalidierung
|
|
$validator = new FileValidator();
|
|
if (!$validator->isSafe($file)) {
|
|
return $this->back()->withErrors([
|
|
'document' => 'Die Datei ist möglicherweise schädlich.',
|
|
]);
|
|
}
|
|
|
|
// Datei speichern
|
|
$path = $file->store('documents');
|
|
```
|
|
|
|
## Sicherheitsprotokollierung und -überwachung
|
|
|
|
Das Framework bietet umfangreiche Protokollierung für Sicherheitsereignisse:
|
|
|
|
```php
|
|
use App\Framework\Security\SecurityLogger;
|
|
|
|
// In einem Controller oder Service
|
|
$securityLogger = $this->container->get(SecurityLogger::class);
|
|
|
|
// Sicherheitsereignis protokollieren
|
|
$securityLogger->log('authentication_failure', [
|
|
'user_id' => $user->id,
|
|
'ip' => $request->ip(),
|
|
'user_agent' => $request->userAgent(),
|
|
]);
|
|
```
|
|
|
|
### Sicherheitsbenachrichtigungen
|
|
|
|
Sie können auch Benachrichtigungen für wichtige Sicherheitsereignisse konfigurieren:
|
|
|
|
```php
|
|
use App\Framework\Security\SecurityNotifier;
|
|
|
|
// In einem Controller oder Service
|
|
$securityNotifier = $this->container->get(SecurityNotifier::class);
|
|
|
|
// Benachrichtigung senden
|
|
$securityNotifier->notify('suspicious_login', [
|
|
'user_id' => $user->id,
|
|
'ip' => $request->ip(),
|
|
'location' => $geoip->getLocation($request->ip()),
|
|
'time' => now(),
|
|
]);
|
|
```
|
|
|
|
## Sicherheits-Checkliste
|
|
|
|
Hier ist eine Checkliste, um sicherzustellen, dass Ihre Anwendung sicher ist:
|
|
|
|
1. **Eingabevalidierung**: Validieren Sie alle Benutzereingaben.
|
|
2. **Ausgabebereinigung**: Bereinigen Sie alle Ausgaben, um XSS zu verhindern.
|
|
3. **CSRF-Schutz**: Verwenden Sie CSRF-Token in allen Formularen und AJAX-Anfragen.
|
|
4. **Authentifizierung**: Implementieren Sie sichere Authentifizierungsmechanismen.
|
|
5. **Autorisierung**: Implementieren Sie rollenbasierte und fähigkeitsbasierte Zugriffskontrolle.
|
|
6. **Sichere Passwörter**: Verwenden Sie sichere Passwort-Hashing-Algorithmen.
|
|
7. **HTTPS**: Erzwingen Sie HTTPS für Ihre Anwendung.
|
|
8. **Sichere Cookies**: Konfigurieren Sie sichere Cookies.
|
|
9. **Sicherheitsheader**: Setzen Sie wichtige Sicherheitsheader.
|
|
10. **Datei-Uploads**: Validieren Sie Datei-Uploads sorgfältig.
|
|
11. **Fehlerbehandlung**: Zeigen Sie keine sensiblen Informationen in Fehlermeldungen an.
|
|
12. **Protokollierung**: Protokollieren Sie Sicherheitsereignisse.
|
|
13. **Aktualisierungen**: Halten Sie das Framework und alle Abhängigkeiten aktuell.
|
|
|
|
## Weitere Informationen
|
|
|
|
- [Authentifizierungs-Anleitung](authentication.md): Erfahren Sie mehr über die Authentifizierungsfunktionen des Frameworks.
|
|
- [Autorisierungs-Anleitung](authorization.md): Erfahren Sie mehr über die Autorisierungsfunktionen des Frameworks.
|
|
- [WAF-Anleitung](../components/waf/index.md): Erfahren Sie mehr über die Web Application Firewall des Frameworks.
|
|
- [Validierungs-Anleitung](validation.md): Erfahren Sie mehr über die Validierungsfunktionen des Frameworks.
|
|
- [Architekturübersicht](../architecture/overview.md): Überblick über die Architektur des Frameworks.
|