# 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
= $user->name ?>
= raw($user->html_content) ?>
```
### 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
```
Die `csrf_field()`-Funktion generiert ein verstecktes Eingabefeld mit einem CSRF-Token:
```html
```
### 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.