[PHP] Jak zabezpieczyć formularz?

Aby zabezpieczyć swoją stronę przed atakami i niechcianymi danymi stosujemy walidację oraz sanitizację przesyłanych danych. Dodatkowo oprócz tego należy zabezpieczyć formularz przed atakami CSRF (Cross-Site Request Forgery). W tym celu dla każdego formularza należy wygenerować specjalny token przechowywany w sesji.

Zabezpieczenie przed CSRF

Ten przykład pokaże jak wdrożyć proste zabezpieczenie przed CSRF. Na początku stwórzmy przykładowy formularz:

<form action="send.php" method="POST">
    <input type="text" name="name" required>
    <input type="email" name="email" required>

    <!-- Ukryte pole z tokenem CSRF -->
    <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token']; ?>">

    <button type="submit">Wyślij</button>
</form>

W formularzu znalazło się dodatkowe (ukryte) pole zawierające nasz CSRF token.

Teraz skrypt obsługujący nasz formularz:

<?php

if($_SERVER['REQUEST_METHOD' ] == 'POST') {

    if(isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
        
        // Resetujemy token po użyciu
        unset($_SESSION['csrf_token']);
        
        // Wszystko ok, można dalej przetwarzać dane
        
    }
    
    else {
    
        // Nieprawidłowy CSRF token
        
    }
    
}

else {
    
    // Błędna REQUEST_METHOD
        
}

W skrypcie porównujemy przesłany CSRF token z tym zapisanym w sesji, jeśli się zgadzają wszystko ok. Ponadto w skrypcie sprawdzamy czy dane zostały przesłane odpowiednią metodą (w tym przypadku `POST`).

Komentarze