Zpět na blog
SecurityBackendBest Practices

Jak správně zabezpečit webovou aplikaci: Kompletní průvodce

Praktický průvodce zabezpečením webových aplikací. OWASP Top 10, autentizace, autorizace a best practices pro rok 2025.

10. prosince 2024
15 min čtení
Jak správně zabezpečit webovou aplikaci: Kompletní průvodce

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

PHP
"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

PHP
"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

PHP
"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ě:

PHP
"variable">$users = DB::select("SELECT * FROM users WHERE email = '">$email'");

  • ✅ Správně:
PHP
"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:

BLADE
{{ $userInput }} <!-- Bezpečné -->
{!! $userInput !!} <!-- Nebezpečné - raw HTML -->

CSRF ochrana

BLADE
<form method="POST">
    @csrf
    <!-- formulář -->
</form>

Rate Limiting

PHP
"comment">// routes/api.php
Route::middleware('throttle:60,1')->group("keyword">function () {
    Route::post('/login', [AuthController::"keyword">class, 'login']);
});

Security Headers

PHP
"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šší.