API, Autentikasi, dan Keamanan · 6/7
Celah keamanan yang benar-benar akan kamu temui
XSS, SQL injection, CSRF, dan IDOR — bentuknya dalam kode, dan cara memperbaiki masing-masing.
Baca 35 menit
Setelah pelajaran ini kamu bisa
- Mengenali XSS, SQL injection, CSRF, dan IDOR dalam kode
- Menyebutkan perbaikan yang tepat untuk masing-masingnya
- Menjelaskan bedanya escaping dan sanitising
- Menjelaskan gunanya audit dependency
Empat celah keamanan mencakup sebagian besar dari yang akan benar-benar kamu temui. Kamu sudah melihat masing-masingnya secara terpisah di jalur ini; ini semuanya sekaligus, beserta perbaikannya.
| Celah | Penyerangnya | Perbaikannya |
|---|---|---|
| XSS | Menyuntikkan script ke sebuah halaman | Escape output-nya; jangan pernah innerHTML untuk data pengguna |
| SQL injection | Menyuntikkan SQL ke sebuah query | Query berparameter, selalu |
| CSRF | Membuat browser korban mengirim sebuah request | Cookie sameSite; sebuah token untuk form |
| IDOR | Mengubah sebuah id untuk mengakses data orang lain | Periksa kepemilikan terhadap session-nya |
XSS
Escaping, diimplementasikan. Perhatikan karakter mana yang penting dan kenapa membuang tag saja tidak cukup.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
SQL injection
Apa yang sebenarnya diterima database, dengan kedua cara. Bedanya adalah apakah nilainya bisa jadi sintaks.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
CSRF
CSRF — cross-site request forgery — tidak mencuri cookie-mu. Ia membuat *browser-mu sendiri* mengirim request yang tidak kamu maksudkan, dan cookie-mu ikut terkirim otomatis karena itulah sifat cookie.
<!-- On evil.example, which you visit while signed in to your bank. -->
<form action="https://bank.example/transfer" method="POST">
<input type="hidden" name="to" value="attacker" />
<input type="hidden" name="amount" value="1000000" />
</form>
<script>document.forms[0].submit()</script>
<!-- Your browser sends the POST, with your session cookie attached.
The bank sees a perfectly authenticated request. -->Dua pertahanannya, sebagai logika keputusan. SameSite saja sudah menghentikan serangan klasiknya.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Dependency-mu
Kamu meng-install ratusan package yang belum kamu baca. Masing-masingnya jalan dengan izinmu saat development dan di dalam server-mu di production. Ini permukaan serangan yang nyata, dan sudah pernah dipakai.
- Audit secara rutin.
bun auditataunpm auditmendaftar celah keamanan yang sudah diketahui di apa yang kamu install. - Commit lockfile-nya. Itu satu-satunya catatan tentang kode tepat yang kamu kirim.
- Baca nama package-nya dengan teliti. Nama tiruan hasil salah ketik duduk berdampingan dengan yang asli di hasil pencarian.
- Blokir script install. Mereka dieksekusi saat install, sebelum kamu menjalankan apa pun.
trustedDependenciesdi proyek ini adalah allowlist untuk itu. - Utamakan dependency yang lebih sedikit. Setiap yang kamu hindari adalah kode yang tidak perlu kamu percayai — itu sebabnya proyek ini menulis sendiri negosiasi bahasa dan validasinya alih-alih meng-install-nya.
Tugas praktik
Jalankan bun audit di proyek ini dan baca output-nya. Lalu pilih dependency mana pun di package.json, buka foldernya di node_modules, dan baca package.json-nya — perhatikan berapa banyak dependency yang ia punya. Terakhir, jalankan ls node_modules | wc -l dan renungkan seberapa banyak kode yang kamu percayai untuk menampilkan satu situs belajar.
Hasil yang diharapkan
Beberapa ratus package, sebagian besar transitif.