Lindungi situs web Anda dari lubang keamanan yang sangat umum dengan penanganan CSRF bawaan Django.

Django adalah kerangka kerja web Python yang dapat Anda gunakan untuk membangun aplikasi web yang aman. Ini menawarkan banyak fitur untuk membantu pengembang dengan keamanan. Salah satu fitur ini adalah token CSRF, penting dalam melindungi formulir dari serangan Cross-Site Request Forgery.

Apa Itu Token CSRF?

Token CSRF adalah fitur keamanan yang melindungi aplikasi web dari Serangan Cross-Site Request Forgery (CSRF).. Ini memungkinkan server aplikasi untuk memeriksa apakah pengiriman formulir berasal dari browser asli atau dipalsukan oleh peretas.

Token CSRF adalah input formulir yang melacak sesi pengguna. Sebuah situs web kerangka kerja aplikasi web sisi server biasanya menghasilkan token CSRF untuk setiap sesi pengguna unik. Server memeriksa apakah token sudah benar setiap kali pengguna mengirimkan formulir. Token CSRF umumnya terdiri dari string dan angka acak, membuat nilainya tidak dapat diprediksi.

Pembuatan Token CSRF di Django

milik Django Dapat token() fungsi secara acak menghasilkan token CSRF. Untuk menemukan fungsi ini, navigasikan ke csrf.py file di dalam Anda Lingkungan virtual Python. Struktur folder akan terlihat seperti ini:

env/

└── Lib/

└── situs-paket/

└── django/

└── perangkat tengah/

└── csrf.py

Di dalam file ini, Anda akan menemukan Dapat token() fungsi, yang mengembalikan token. Django menggunakan penyamaran data untuk melindungi nilai token dari peretas.

Secara default, Django mengaktifkan perlindungan CSRF untuk situs Anda dengan menambahkan django.middleware.csrf. CsrfViewMiddleware dalam PERANGKAT TENGAH daftar Anda pengaturan.py mengajukan. Yang perlu Anda lakukan hanyalah menambahkan {% csrf_token %} untuk Anda POS formulir. Tanpa menambahkan {% csrf_token %}, Anda akan mendapatkan 403 (dilarang) kesalahan saat Anda mengirimkan formulir.

Ketika Anda menambahkan {% csrf_token %} ke formulir Anda, itu secara otomatis membuat bidang input tersembunyi dengan nama csrfmiddlewaretoken, yang berisi nilai token CSRF bertopeng. Server menggunakan nilai ini untuk menentukan apakah pengiriman formulir itu asli. Anda dapat memeriksa nilai bidang tersembunyi ini dengan melihat sumber halaman atau menggunakan fitur alat pengembang browser Anda.

Bagaimana Token CSRF Bekerja di Django

Saat Anda meluncurkan situs Anda dengan formulir, Django secara otomatis membuat kuki peramban ditelepon csrftoken. Cookie ini melacak aktivitas pengguna di situs dan secara unik mengidentifikasi setiap pengguna.

Saat pengguna mengirimkan formulir, server membandingkan nilai cookie dengan nilai file csrfmiddlewaretoken di kolom input tersembunyi. Jika nilai ini cocok, server akan memproses formulir dengan sukses, jika tidak maka akan menghasilkan kesalahan.

Sekilas, nilai cookie dan csrfmiddlewaretoken tampil beda. Ini disengaja dan menambahkan lapisan perlindungan ekstra ke token CSRF. Token CSRF dibandingkan dengan cookie seperti ini:

  • Itu Dapat token() function menutupi token CSRF sebelum meneruskannya ke kolom input.
  • Saat formulir dikirimkan, token CSRF dibuka kedoknya dengan bantuan kunci rahasia di file pengaturan.
  • Token yang dibuka kedoknya dibandingkan dengan cookie sesi.
  • Jika nilainya sama, formulir akan diproses. Jika tidak, server mengembalikan kesalahan.

Untuk mencegah peretas mencuri token CSRF anda, Django memperbaruinya setiap kali memulai sesi pengguna.

Membuat Token CSRF Kustom

Meskipun Django membuatnya mudah untuk melindungi formulir Anda hanya dengan menambahkan {% csrf_token %}, menghasilkan token CSRF dan menambahkannya secara manual ke formulir Anda juga dimungkinkan. Untuk melakukannya, impor file Dapat token() fungsi:

dari django.middleware.csrf impor Dapat token

Dalam pandangan Anda, Anda dapat membuat token CSRF seperti ini:

defview_name(meminta):
csrf_token = get_token (permintaan)

# melakukan logika tampilan
konteks = {
"csrf_token": csrf_token
}

kembali memberikan (permintaan, 'nama_aplikasi/template.html', konteks=konteks)

Di template HTML Anda, Anda dapat secara manual memasukkan tag input Anda dan menambahkan csrf_token untuk itu seperti ini:

<membentukmetode="POS" >
<memasukkanjenis="tersembunyi"nama="csrfmiddlewaretoken"nilai="{{ csrf_token }}">
{{form.as_p}}
<tomboljenis="kirim"kelas="btn btn-outline-sekunder">Tambahkan Bukutombol>
membentuk>

Alternatifnya, Anda dapat membuat kolom input tersembunyi dari tampilan Anda seperti ini:

defyour_view(meminta):
csrf_token = get_token (permintaan)
csrf_token_html = ''.format (csrf_token)

# melakukan logika tampilan
konteks = {
"csrf_token": csrf_token_html
}

kembali memberikan (permintaan, 'nama_aplikasi/template.html', konteks=konteks)

Anda kemudian dapat menambahkannya ke template HTML Anda seperti ini:

<membentukmetode="POS" >
{{ csrf_token_html|aman }}
{{form.as_p}}
<tomboljenis="kirim"kelas="btn btn-outline-sekunder">Tambahkan Bukutombol>
membentuk>

Jika Anda ingin sepenuhnya mengontrol perlindungan CSRF formulir Anda, Anda dapat melakukannya dengan membandingkan token CSRF Anda dengan cookie yang disimpan di browser. Berdasarkan hasil perbandingan, Anda dapat menangani pengiriman formulir sesuka Anda. Ini contohnya:

dari django.shortcuts impor memberikan
dari django.middleware.csrf impor get_token, _unmask_cipher_token
dari django.utils.crypto impor konstanta_waktu_bandingkan

defyour_view(meminta):
# Hasilkan token CSRF khusus
csrf_token = get_token (permintaan)
csrf_cookie = permintaan. COOKIES.dapatkan('csrftoken')

# buka topeng csrf token
unmasked_csrf_token = _unmask_cipher_token (csrf_token)

# Bandingkan token
jikabukan constant_time_compare (unmasked_csrf_token, csrf_cookie):
# Tangani kasus di mana token tidak cocok
lulus
kalau tidak:
# Tangani kasus di mana token cocok
lulus

# Render templatnya
konteks = {
'csrf_token': csrf_token,
}

kembali memberikan (permintaan, 'nama_aplikasi/template.html', konteks=konteks)

Cuplikan kode ini mengambil file csrf_cookie dari objek permintaan HTTP. Ini kemudian menggunakan _unmask_cipher_token() berfungsi untuk membuka kedok csrf_token.

Pernyataan bersyarat membandingkan nilai-nilai yang diambil csrf_cookie dan yang tidak bertopeng csrf_token. Perbandingan ini menggunakan konstanta_waktu_bandingkan berfungsi untuk melindungi dari eksploitasi waktu. Anda dapat menulis logika Anda berdasarkan hasil perbandingan.

Menonaktifkan Perlindungan CSRF di Django

Meskipun Django membuat ketentuan default untuk perlindungan CSRF, Anda dapat menonaktifkannya di proyek Anda jika Anda mau. Ada dua cara untuk melakukan ini:

  • Menonaktifkan perlindungan CSRF di seluruh situs web Anda.
  • Menonaktifkan perlindungan CSRF pada tampilan tertentu.

Menonaktifkan Perlindungan CSRF di Seluruh Situs Web Anda

Untuk menonaktifkan perlindungan CSRF Django di situs web Anda, Anda cukup menghapus middleware CSRF dari berkas pengaturan Anda. Di file pengaturan Anda, cari daftar yang disebut PERANGKAT TENGAH. Di dalam daftar, cari ini:

'django.middleware.csrf. CsrfViewMiddleware',

Setelah Anda menemukannya, Anda harus menghapusnya dari kode Anda untuk perlindungan CSRF default Django untuk menonaktifkannya.

Menonaktifkan Perlindungan CSRF pada Tampilan Tertentu

Jika Anda hanya ingin menonaktifkan perlindungan CSRF pada tampilan Django tertentu, gunakan @csrf_exempt penghias. Berikut cuplikan kode untuk ditunjukkan:

dari django.views.decorators.csrf impor csrf_exempt

@csrf_exempt
defview_name(meminta):
# melakukan logika tampilan
lulus

Itu @csrf_exempt dekorator hanyalah salah satu dari beberapa yang terkait dengan perlindungan CSRF di Django. Anda dapat membaca tentang sisanya Referensi CSRF Django.

Jangan Nonaktifkan Perlindungan CSRF di Situs Web Anda

Meskipun Django memungkinkan, menonaktifkan mekanisme perlindungan CSRF bawaan Django tidak disarankan. Melakukannya akan membuat situs Anda rentan terhadap serangan CSRF dan pada akhirnya memengaruhi pengguna aplikasi Anda secara negatif.

Kecuali jika Anda adalah pengembang berpengalaman yang tahu bagaimana menerapkan mekanisme perlindungan CSRF kustom, Anda harus bekerja dengan alternatif yang disediakan oleh Django.