Farih.co.id
Home Programming Memahami Token CSRF Django: Apa Itu dan Mengapa Anda Membutuhkannya

Memahami Token CSRF Django: Apa Itu dan Mengapa Anda Membutuhkannya

a cycle of a computer user a computer and a hacker

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. Kerangka aplikasi web sisi server situs web 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 lingkungan virtual Python Anda. Struktur folder akan terlihat seperti ini:

 env/

└── Lib/

    └── site-packages/

        └── django/

            └── middleware/

                └── 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.

Halaman kesalahan terlarang 403 Django dalam mode pengembangan

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.

bidang input tersembunyi token csrf ditambahkan oleh django

Bagaimana Token CSRF Bekerja di Django

Saat Anda meluncurkan situs Anda dengan formulir, Django secara otomatis membuat kuki peramban yang disebut 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.

cookie csrf disimpan di penyimpanan browser

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:

 from django.middleware.csrf import get_token

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

 def view_name(request):
    csrf_token = get_token(request)

    
    context = {
        "csrf_token": csrf_token
    }

    return render(request, 'app_name/template.html', context=context)

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

 <form method="POST" >
    <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
    {{form.as_p}}
    <button type="submit" class="btn btn-outline-secondary">Add Book</button>
</form>

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

 def your_view(request):
    csrf_token = get_token(request)
    csrf_token_html = '<input type="hidden" name="csrfmiddlewaretoken" value="{}" />'.format(csrf_token)

    
    context = {
        "csrf_token": csrf_token_html
    }

    return render(request, 'app_name/template.html', context=context)

Anda kemudian dapat menambahkannya ke template HTML Anda seperti ini:

 <form method="POST" >
    {{ csrf_token_html|safe }}
    {{form.as_p}}
    <button type="submit" class="btn btn-outline-secondary">Add Book</button>
</form>

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. Berikut contohnya:

 from django.shortcuts import render
from django.middleware.csrf import get_token, _unmask_cipher_token
from django.utils.crypto import constant_time_compare

def your_view(request):
    
    csrf_token = get_token(request)
    csrf_cookie = request.COOKIES.get('csrftoken')

    
    unmasked_csrf_token = _unmask_cipher_token(csrf_token)
    
    
    if not constant_time_compare(unmasked_csrf_token, csrf_cookie):
        
        pass
    else:
        
        pass
        
    
    context = {
        'csrf_token': csrf_token,
    }

    return render(request, 'app_name/template.html', context=context)

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 diperagakan:

 from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def view_name(request):
    
    pass

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 dianjurkan. 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.

Comment
Share:

Leave a Reply

Your email address will not be published. Required fields are marked *

Ad