Προστατέψτε τον ιστότοπό σας από μια πολύ κοινή τρύπα ασφαλείας με τον ενσωματωμένο χειρισμό CSRF του Django.
Το Django είναι ένα πλαίσιο ιστού Python που μπορείτε να χρησιμοποιήσετε για τη δημιουργία ασφαλών εφαρμογών ιστού. Προσφέρει πολλές δυνατότητες για να βοηθήσει τους προγραμματιστές με ασφάλεια. Ένα από αυτά τα χαρακτηριστικά είναι τα διακριτικά CSRF, τα οποία είναι απαραίτητα για την προστασία των φορμών από επιθέσεις πλαστογράφησης αιτημάτων μεταξύ ιστοτόπων.
Τι είναι ένα διακριτικό CSRF;
Ένα διακριτικό CSRF είναι μια δυνατότητα ασφαλείας που προστατεύει τις εφαρμογές Ιστού από Επιθέσεις πλαστογράφησης αιτημάτων μεταξύ ιστότοπων (CSRF).. Επιτρέπει στον διακομιστή εφαρμογών να ελέγχει εάν μια υποβολή φόρμας προήλθε από αυθεντικό πρόγραμμα περιήγησης ή αν την παραχάραξε ένας χάκερ.
Τα διακριτικά CSRF είναι είσοδοι φόρμας που παρακολουθούν μια περίοδο λειτουργίας χρήστη. Μια ιστοσελίδα πλαίσιο εφαρμογών ιστού από την πλευρά του διακομιστή συνήθως δημιουργεί διακριτικά CSRF για κάθε μοναδική περίοδο λειτουργίας χρήστη. Ο διακομιστής ελέγχει εάν το διακριτικό είναι σωστό κάθε φορά που ένας χρήστης υποβάλλει μια φόρμα. Τα διακριτικά CSRF αποτελούνται γενικά από τυχαίες συμβολοσειρές και αριθμούς, καθιστώντας τις τιμές τους απρόβλεπτες.
CSRF Token Generation στο Django
του Django get_token() η λειτουργία δημιουργεί τυχαία διακριτικά CSRF. Για να βρείτε αυτήν τη λειτουργία, μεταβείτε στο csrf.py αρχείο μέσα σας Εικονικό περιβάλλον Python. Η δομή του φακέλου θα πρέπει να μοιάζει με αυτό:
env/
└── Lib/
└── site-packages/
└── django/
└── ενδιάμεσο λογισμικό/
└── csrf.py
Μέσα σε αυτό το αρχείο, θα βρείτε το get_token() συνάρτηση, η οποία επιστρέφει το διακριτικό. Χρησιμοποιεί το Django κάλυψη δεδομένων για την προστασία της αξίας του διακριτικού από τους χάκερ.
Από προεπιλογή, το Django ενεργοποιεί την προστασία CSRF για τον ιστότοπό σας προσθέτοντας django.middleware.csrf. CsrfViewMiddleware στο ΜΙΔΕΛΙΚΟ ΛΟΓΙΣΜΟ λίστα σας settings.py αρχείο. Το μόνο που χρειάζεται να κάνετε είναι να προσθέσετε {% csrf_token %} στο δικό σου ΘΕΣΗ μορφές. Χωρίς προσθήκη {% csrf_token %}, θα πάρετε ένα 403 απαγορευμένο) σφάλμα κατά την υποβολή μιας φόρμας.
Όταν προσθέτετε {% csrf_token %} στη φόρμα σας, δημιουργεί αυτόματα ένα κρυφό πεδίο εισαγωγής με το όνομα csrfmiddlewaretoken, το οποίο περιέχει την τιμή του καλυμμένου διακριτικού CSRF. Ο διακομιστής χρησιμοποιεί αυτήν την τιμή για να προσδιορίσει εάν η υποβολή της φόρμας είναι αυθεντική. Μπορείτε να ελέγξετε την τιμή αυτού του κρυφού πεδίου προβάλλοντας την πηγή της σελίδας ή χρησιμοποιώντας τη λειτουργία εργαλείων προγραμματιστή του προγράμματος περιήγησής σας.
Πώς λειτουργούν τα CSRF Tokens στο Django
Όταν εκκινείτε τον ιστότοπό σας με τη φόρμα, το Django δημιουργεί αυτόματα ένα cookie προγράμματος περιήγησης που ονομάζεται csrftoken. Αυτό το cookie παρακολουθεί τη δραστηριότητα των χρηστών στον ιστότοπο και προσδιορίζει μοναδικά κάθε χρήστη.
Όταν ο χρήστης υποβάλλει τη φόρμα, ο διακομιστής συγκρίνει την τιμή του cookie με την τιμή του csrfmiddlewaretoken στο κρυφό πεδίο εισαγωγής. Εάν αυτές οι τιμές ταιριάζουν, ο διακομιστής θα επεξεργαστεί τη φόρμα με επιτυχία, διαφορετικά θα δημιουργήσει σφάλμα.
Με την πρώτη ματιά, οι τιμές του cookie και του csrfmiddlewaretoken φαίνεται να είναι διαφορετικό. Αυτό γίνεται σκόπιμα και προσθέτει ένα επιπλέον επίπεδο προστασίας στο διακριτικό CSRF. Το διακριτικό CSRF συγκρίνεται με το cookie ως εξής:
- ο get_token() Η συνάρτηση καλύπτει το διακριτικό CSRF πριν το μεταβιβάσει στο πεδίο εισαγωγής.
- Όταν υποβάλλεται η φόρμα, το διακριτικό CSRF αποκαλύπτεται με τη βοήθεια του μυστικού κλειδιού στο αρχείο ρυθμίσεων.
- Το διακριτικό χωρίς μάσκα συγκρίνεται με το cookie περιόδου λειτουργίας.
- Εάν οι τιμές είναι ίδιες, η φόρμα υποβάλλεται σε επεξεργασία. Εάν όχι, ο διακομιστής επιστρέφει ένα σφάλμα.
Για να αποτρέψει τους χάκερ από το να κλέψουν το διακριτικό σας CSRF, το Django το ανανεώνει κάθε φορά που ξεκινά μια περίοδο λειτουργίας χρήστη.
Δημιουργία προσαρμοσμένων διακριτικών CSRF
Αν και το Django διευκολύνει την προστασία των φορμών σας προσθέτοντας απλώς το {% csrf_token %}, είναι επίσης δυνατή η δημιουργία διακριτικών CSRF και η μη αυτόματη προσθήκη τους στις φόρμες σας. Για να το κάνετε αυτό, εισαγάγετε το get_token() λειτουργία:
από django.middleware.csrf εισαγωγή get_token
Κατά την άποψή σας, μπορείτε να δημιουργήσετε το διακριτικό CSRF ως εξής:
defview_name(αίτηση):
csrf_token = get_token (αίτημα)# εκτέλεση λογικής προβολής
πλαίσιο = {
"csrf_token": csrf_token
}
ΕΠΙΣΤΡΟΦΗ απόδοση (αίτημα, 'app_name/template.html', context=context)
Στο πρότυπό σας HTML, μπορείτε να συμπεριλάβετε με μη αυτόματο τρόπο την ετικέτα εισαγωγής και να προσθέσετε την csrf_token σε αυτό ως εξής:
<μορφήμέθοδος="ΘΕΣΗ" >
<εισαγωγήτύπος="κρυμμένος"όνομα="csrfmiddlewaretoken"αξία="{{ csrf_token }}">
{{form.as_p}}
<κουμπίτύπος="υποβάλλουν"τάξη="btn btn-outline-secondary">Προσθήκη βιβλίουκουμπί>
μορφή>
Εναλλακτικά, μπορείτε να δημιουργήσετε το κρυφό πεδίο εισαγωγής από τις προβολές σας ως εξής:
defyour_view(αίτηση):
csrf_token = get_token (αίτημα)
csrf_token_html = ''.format (csrf_token)# εκτέλεση λογικής προβολής
πλαίσιο = {
"csrf_token": csrf_token_html
}
ΕΠΙΣΤΡΟΦΗ απόδοση (αίτημα, 'app_name/template.html', context=context)
Στη συνέχεια, μπορείτε να το προσθέσετε στο πρότυπό σας HTML ως εξής:
<μορφήμέθοδος="ΘΕΣΗ" >
{{ csrf_token_html|ασφαλές }}
{{form.as_p}}
<κουμπίτύπος="υποβάλλουν"τάξη="btn btn-outline-secondary">Προσθήκη βιβλίουκουμπί>
μορφή>
Εάν θέλετε να ελέγξετε πλήρως την προστασία CSRF της φόρμας σας, μπορείτε να το κάνετε συγκρίνοντας το διακριτικό CSRF με το cookie που είναι αποθηκευμένο στο πρόγραμμα περιήγησης. Με βάση τα αποτελέσματα της σύγκρισης, μπορείτε να χειριστείτε την υποβολή της φόρμας όπως θέλετε. Εδώ είναι ένα παράδειγμα:
από django.συντομεύσεις εισαγωγή καθιστώ
από django.middleware.csrf εισαγωγή get_token, _unmask_cipher_token
από django.utils.crypto εισαγωγή σταθερός_χρόνος_σύγκρισηdefyour_view(αίτηση):
# Δημιουργήστε ένα προσαρμοσμένο διακριτικό CSRF
csrf_token = get_token (αίτημα)
csrf_cookie = αίτημα. COOKIES.get('csrftoken')# ξεμάσκα csrf διακριτικό
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# Συγκρίνετε τα διακριτικά
ανδεν Constant_time_compare (unmasked_csrf_token, csrf_cookie):
# Χειριστείτε την περίπτωση που οι μάρκες δεν ταιριάζουν
πέρασμα
αλλού:
# Χειριστείτε την περίπτωση όπου τα διακριτικά ταιριάζουν
πέρασμα
# Απόδοση του προτύπου
πλαίσιο = {
'csrf_token': csrf_token,
}
ΕΠΙΣΤΡΟΦΗ απόδοση (αίτημα, 'app_name/template.html', context=context)
Αυτό το απόσπασμα κώδικα ανακτά το csrf_cookie από το αντικείμενο αιτήματος HTTP. Στη συνέχεια χρησιμοποιεί το _unmask_cipher_token() λειτουργία για να αποκαλύψει το csrf_token.
Μια δήλωση υπό όρους συγκρίνει τις τιμές των ανακτημένων csrf_cookie και οι ακάλυπτοι csrf_token. Αυτή η σύγκριση χρησιμοποιεί το σταθερός_χρόνος_σύγκριση λειτουργία για προστασία από εκμεταλλεύσεις συγχρονισμού. Μπορείτε να γράψετε τη λογική σας με βάση το αποτέλεσμα της σύγκρισης.
Απενεργοποίηση προστασίας CSRF στο Django
Παρόλο που το Django παρέχει μια προεπιλεγμένη διάταξη για προστασία CSRF, μπορείτε να την απενεργοποιήσετε στο έργο σας εάν θέλετε. Υπάρχουν δύο τρόποι για να γίνει αυτό:
- Απενεργοποίηση προστασίας CSRF σε ολόκληρο τον ιστότοπό σας.
- Απενεργοποίηση προστασίας CSRF σε μια συγκεκριμένη προβολή.
Απενεργοποίηση προστασίας CSRF σε ολόκληρο τον ιστότοπό σας
Για να απενεργοποιήσετε την προστασία CSRF του Django στον ιστότοπό σας, πρέπει απλώς να αφαιρέσετε το ενδιάμεσο λογισμικό CSRF από το αρχείο ρυθμίσεών σας. Στο αρχείο ρυθμίσεών σας, εντοπίστε μια λίστα που ονομάζεται ΜΙΔΕΛΙΚΟ ΛΟΓΙΣΜΟ. Μέσα στη λίστα, αναζητήστε αυτό:
'django.middleware.csrf. CsrfViewMiddleware',
Μόλις το βρείτε, θα πρέπει να το αφαιρέσετε από τον κώδικά σας για την προεπιλεγμένη προστασία CSRF του Django για να την απενεργοποιήσετε.
Απενεργοποίηση προστασίας CSRF σε συγκεκριμένη προβολή
Εάν θέλετε να απενεργοποιήσετε την προστασία CSRF μόνο σε μια συγκεκριμένη προβολή Django, χρησιμοποιήστε το @csrf_exempt διακοσμητής. Ακολουθεί ένα απόσπασμα κώδικα για επίδειξη:
από django.views.decorators.csrf εισαγωγή csrf_exempt
@csrf_exempt
defview_name(αίτηση):
# εκτέλεση λογικής προβολής
πέρασμα
ο @csrf_exempt Ο διακοσμητής είναι μόνο ένα από τα πολλά που σχετίζονται με την προστασία CSRF στο Django. Μπορείτε να διαβάσετε για τα υπόλοιπα στο Αναφορά CSRF του Django.
Μην απενεργοποιείτε την προστασία CSRF στον ιστότοπό σας
Αν και το Django το καθιστά δυνατό, η απενεργοποίηση του ενσωματωμένου μηχανισμού προστασίας CSRF του Django δεν συνιστάται. Κάτι τέτοιο θα καταστήσει τον ιστότοπό σας ευάλωτο σε επιθέσεις CSRF και τελικά θα επηρεάσει αρνητικά τους χρήστες της εφαρμογής σας.
Αν δεν είστε έμπειρος προγραμματιστής που ξέρει πώς να εφαρμόσει έναν προσαρμοσμένο μηχανισμό προστασίας CSRF, θα πρέπει να εργαστείτε με την εναλλακτική που παρέχει το Django.