Το CSRF είναι μια κακόβουλη δραστηριότητα που εκτελείται από έναν εισβολέα, ο οποίος εκτελεί ενέργειες για λογαριασμό ενός πιστοποιημένου χρήστη, επιζήμιες για την ασφάλεια ιστού. Ευτυχώς, η Laravel παρέχει τα εργαλεία για την πρόληψη αυτού του τύπου ευπάθειας.
Οι επιθέσεις CSRF παραβιάζουν τις συνεδρίες χρήστη. Αυτό το κάνουν εξαπατώντας έναν χρήστη να υποβάλει αίτημα μέσω κρυφών ετικετών φόρμας ή κακόβουλων διευθύνσεων URL (εικόνες ή συνδέσμους) χωρίς να το γνωρίζει ο χρήστης.
Αυτή η επίθεση οδηγεί σε αλλαγή της κατάστασης περιόδου λειτουργίας χρήστη, διαρροές δεδομένων και μερικές φορές οι χάκερ μπορούν να χειριστούν τα δεδομένα τελικού χρήστη σε μια εφαρμογή.
Η παραπάνω εικόνα απεικονίζει ένα σενάριο όπου παραβιάζεται η ασφάλεια ιστού. Το θύμα στέλνει ένα αίτημα κάνοντας κλικ σε έναν σύνδεσμο (λήφθηκε), στέλνοντας ένα αίτημα σε έναν διακομιστή ιστότοπου που θα παράγει αποτελέσματα που επιθυμεί ο χάκερ, ο οποίος έχει στην κατοχή του τις χρήσιμες πληροφορίες για την πρόσβαση και τον χειρισμό του διακομιστή ιστότοπου.
Για τη βελτίωση του ασφάλεια web των εφαρμογών σας, σε κάθε περίοδο λειτουργίας χρήστη, η Laravel δημιουργεί ασφαλή διακριτικά τα οποία χρησιμοποιεί για να διασφαλίσει ότι ο χρήστης που έχει πιστοποιηθεί είναι αυτός που ζητά την εφαρμογή.
Επειδή αυτό το διακριτικό αλλάζει κάθε φορά που αναδημιουργείται μια περίοδος σύνδεσης χρήστη, ένας εισβολέας δεν μπορεί να έχει πρόσβαση σε αυτό.
Κάθε φορά που υπάρχει αίτημα για αλλαγή των πληροφοριών χρήστη από την πλευρά του διακομιστή (backend), όπως POST
, PUT
, PATCH
e DELETE
, πρέπει να συμπεριλάβετε την οδηγία @csrf
στη φόρμα αίτησης blade
HTML. ο @csrf
είναι επομένως οδηγία Blade
χρησιμοποιείται για τη δημιουργία ενός κρυφού διακριτικού που επικυρώνεται από την εφαρμογή.
Η οδηγία Blade
ονομάζεται η σύνταξη που χρησιμοποιείται στη μηχανή προτύπων Laravel Λεπίδα . Για να δημιουργήσετε ένα αρχείο blade
πρέπει να του δώσετε ένα όνομα – στην περίπτωσή μας – ακολουθούμενο από την επέκταση της λεπίδας. Αυτό σημαίνει ότι το αρχείο θα έχει το όνομα form.blade.php
.
Το αρχείο χρησιμοποιείται blade
για απόδοση προβολών για τους χρήστες στην ιστοσελίδα. Υπάρχουν μερικές προκαταρκτικές οδηγίεςdefiμπορείτε να χρησιμοποιήσετε τη σύνταξη nite ή blade. Για παράδειγμα, @if
ελέγξτε εάν ικανοποιείται μια συνθήκη, @empty
ελέγξτε αν οι εγγραφές δεν είναι κενές, @auth
ελέγξτε εάν ένας χρήστης έχει πιστοποιηθεί και ούτω καθεξής.
Ας επιστρέψουμε όμως στην οδηγία @csrf
. Δείτε πώς το χρησιμοποιείτε:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Οι προηγούμενες εκδόσεις του Laravel είχαν διαφορετική ρύθμιση: και οι δύο λειτουργούν και κάνουν το ίδιο πράγμα.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Όταν το διακριτικό CSRF λείπει από το αίτημα φόρμας που υποβάλλεται ή εάν φαίνεται άκυρο, η Laravel εκπέμπει ένα μήνυμα σφάλματος "Η σελίδα έληξε" με κωδικό κατάστασης 419.
Το ενδιάμεσο λογισμικό VerifyCsrfToken
χειρίζεται την επαλήθευση CSRF εντός της εφαρμογής Laravel. ο middleware
είναι εγγεγραμμένος στο Kernel.php
και βρίσκεται στον κατάλογο app/Http/Middleware
. Αυτό σημαίνει ότι το middleware
ενεργοποιείται για αιτήματα εντός του ιστού, που δεν σχετίζονται με τα API.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
Το ενδιάμεσο λογισμικό VerifyCsrfToken επεκτείνει την κλάση Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, δηλαδή η επαλήθευση CSRF είναι defiνύχτα μέσα στην τάξη.
Ας ψάξουμε βαθύτερα για να μάθουμε πώς η Laravel χειρίζεται την επαλήθευση CSRF.
Μέσα στην τάξη, έχουμε τη συνάρτηση tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
στον κώδικα καθορίζει εάν η περίοδος σύνδεσης και τα διακριτικά εισόδου CSRF ταιριάζουν.
Η συνάρτηση κάνει δύο πράγματα:
$this->getTokenFromRequest
το διακριτικό από το εισερχόμενο αίτημα που επισυνάπτεται μέσω ενός κρυφού πεδίου ή της κεφαλίδας αιτήματος. Το διακριτικό αποκρυπτογραφείται και στη συνέχεια επιστρέφεται στη μεταβλητή του διακριτικού.protected function getTokenFromRequest($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
try {
$token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
} catch (DecryptException $e) {
$token = '';
}
}
return $token;
}
Στον κώδικα παίρνει διακριτικό από την κεφαλίδα
2. Μεταδώστε τόσο το διακριτικό αίτησης όσο και τη συνεδρία σε μια συμβολοσειρά και, στη συνέχεια, χρησιμοποιήστε το hash_equals
ενσωματωμένο σε PHP για σύγκριση εάν και οι δύο συμβολοσειρές είναι ίσες. Το αποτέλεσμα αυτής της επέμβασης είναι πάντα bool (αληθές) ή (ψευδή) .
Ercole Palmeri
Η ανάπτυξη λεπτών κινητικών δεξιοτήτων μέσω του χρωματισμού προετοιμάζει τα παιδιά για πιο σύνθετες δεξιότητες όπως η γραφή. Να χρωματίσω…
Ο ναυτικός τομέας είναι μια πραγματική παγκόσμια οικονομική δύναμη, η οποία έχει προσανατολιστεί προς μια αγορά 150 δισεκατομμυρίων...
Την περασμένη Δευτέρα, οι Financial Times ανακοίνωσαν συμφωνία με το OpenAI. Η FT αδειοδοτεί την παγκόσμιας κλάσης δημοσιογραφία της…
Εκατομμύρια άνθρωποι πληρώνουν για υπηρεσίες ροής, πληρώνοντας μηνιαίες συνδρομές. Είναι κοινή γνώμη ότι…