Bezpečnost webových aplikací v roce 2025
Kybernetické útoky jsou sofistikovanější než kdy dříve. Pojďme se podívat na klíčové oblasti zabezpečení.
OWASP Top 10 - Hlavní hrozby
- Broken Access Control - nejčastější zranitelnost
- Cryptographic Failures - špatná práce s hesly a daty
- Injection - SQL, NoSQL, OS command
- Insecure Design - chyby v architektuře
- Security Misconfiguration - výchozí nastavení
Autentizace - Jak na to správně
Hashování hesel
"comment">// Laravel - automaticky použije bcrypt
"variable">$user->password = Hash::make("variable">$password);
"comment">// Verifikace
"keyword">if (Hash::check("variable">$password, "variable">$user->password)) {
"comment">// OK
}
Multi-factor autentizace (MFA)
- TOTP (Google Authenticator)
- SMS kódy (méně bezpečné)
- Hardware klíče (FIDO2/WebAuthn)
Session management
"comment">// Regenerace session po loginu
"variable">$request->session()->regenerate();
"comment">// Nastavení cookie
Session::cookie([
'secure' => "keyword">true,
'httponly' => "keyword">true,
'samesite' => 'strict'
]);
Autorizace - Kontrola přístupu
"comment">// Laravel Policies
"keyword">class PostPolicy
{
"keyword">public "keyword">function update(User "variable">$user, Post "variable">$post)
{
"keyword">return "variable">$user->id === "variable">$post->user_id
|| "variable">$user->isAdmin();
}
}
"comment">// Použití v controlleru
"variable">$this->authorize('update', "variable">$post);
Ochrana proti SQL Injection
❌ Špatně:
"variable">$users = DB::select("SELECT * FROM users WHERE email = '">$email'");
- ✅ Správně:
"variable">$users = DB::select("SELECT * FROM users WHERE email = ?", ["variable">$email]);
"comment">// nebo Eloquent
"variable">$users = User::where('email', "variable">$email)->get();
XSS ochrana
Laravel Blade automaticky escapuje výstup:
{{ $userInput }} <!-- Bezpečné -->
{!! $userInput !!} <!-- Nebezpečné - raw HTML -->
CSRF ochrana
<form method="POST">
@csrf
<!-- formulář -->
</form>
Rate Limiting
"comment">// routes/api.php
Route::middleware('throttle:60,1')->group("keyword">function () {
Route::post('/login', [AuthController::"keyword">class, 'login']);
});
Security Headers
"comment">// middleware
"keyword">return "variable">$next("variable">$request)
->header('X-Frame-Options', 'SAMEORIGIN')
->header('X-Content-Type-Options', 'nosniff')
->header('Content-Security-Policy', "default-src 'self'");
Checklist před spuštěním
- ⬜ HTTPS everywhere
- ⬜ Silná hesla + MFA pro adminy
- ⬜ Rate limiting na login/register
- ⬜ Input validace na backendu
- ⬜ Aktuální závislosti (composer audit)
- ⬜ Error handling bez stack traces
- ⬜ Logging bezpečnostních událostí
- ⬜ Pravidelné zálohy
- ⬜ Penetrační test
Závěr
Bezpečnost není jednorázová záležitost, ale kontinuální proces. Investice do zabezpečení se vždy vyplatí - náklady na opravu po útoku jsou mnohonásobně vyšší.
