Ketika bekerja dengan situs berbasis sumber daya (seperti aplikasi MVC atau layanan REST), kami memiliki dua opsi utama ketika klien mencoba ke GET
sumber daya yang mereka tidak memiliki akses ke:
- 403 , yang mengatakan bahwa klien tidak sah ; atau
- 404 , yang mengatakan bahwa sumber daya itu tidak ada (atau tidak dapat ditemukan).
Kebijaksanaan umum dan praktik umum tampaknya merespons dengan kebenaran - yaitu 403. Tetapi saya bertanya-tanya apakah ini sebenarnya hal yang benar untuk dilakukan.
Sistem login yang aman tidak pernah memberi tahu Anda alasan kegagalan login. Artinya, sejauh menyangkut klien, tidak ada perbedaan yang dapat terdeteksi antara nama pengguna yang tidak ada dan kata sandi yang salah. Tujuannya adalah untuk tidak membuat ID pengguna - atau lebih buruk, alamat email - dapat ditemukan.
Dari sudut pandang privasi , tampaknya jauh lebih aman untuk mengembalikan 404. Saya teringat akan insiden di mana seseorang dilaporkan menemukan pemenang dari reality show (Survivor, saya pikir) dengan melihat sumber daya yang tidak ada pada situs vs. mana yang melakukannya. Saya khawatir tentang 403 yang berpotensi memberikan informasi sensitif seperti nomor seri atau nomor akun.
Apakah ada alasan kuat untuk tidak mengembalikan 404? Bisakah kebijakan 404 memiliki efek samping negatif di tempat lain? Jika tidak, mengapa praktik itu tidak lebih umum?
sumber
Jawaban:
Ada kesalahpahaman umum (dan penyalahgunaan) yang terkait
403 Forbidden
: itu tidak seharusnya memberikan apa pun tentang apa yang dipikirkan server tentang permintaan tersebut. Ini secara khusus dirancang untuk mengatakan,UA atau klien mana pun harus menafsirkan bahwa itu berarti bahwa permintaan itu tidak akan pernah berfungsi, dan merespons dengan tepat.
Ini memiliki implikasi untuk klien yang menangani permintaan atas nama pengguna: jika pengguna tidak masuk, atau salah ketik, klien yang menangani permintaan tersebut harus menjawab, "Maaf, tapi saya tidak bisa melakukan apa-apa" setelah pertama kali itu mendapatkan
403
dan berhenti menangani permintaan di masa depan. Jelas, jika Anda ingin pengguna masih dapat meminta akses ke informasi pribadi mereka setelah kegagalan, ini adalah perilaku yang bermusuhan dengan pengguna.403
berbeda dengan401 Authorization Required
, yang tidak memberikan bahwa server akan menangani permintaan selama Anda lulus kredensial yang benar. Ini biasanya yang dipikirkan orang ketika mereka mendengar403
.Ini juga berbeda dengan
404 Page Not Found
yang, seperti yang ditunjukkan orang lain, dirancang tidak hanya untuk mengatakan "Saya tidak dapat menemukan halaman itu" tetapi untuk menyarankan kepada klien bahwa server tidak membuat klaim keberhasilan atau kegagalan untuk permintaan di masa depan.Dengan
401
dan404
, server tidak mengatakan apa pun kepada klien atau UA tentang bagaimana mereka harus melanjutkan: mereka dapat terus berusaha dengan harapan mendapatkan respons yang berbeda.Jadi
404
adalah cara yang tepat untuk menangani halaman yang tidak ingin Anda tunjukkan kepada semua orang, tetapi tidak ingin memberikan apa pun tentang mengapa Anda tidak akan menampilkannya dalam situasi tertentu.Tentu saja, ini mengasumsikan klien membuat permintaan peduli untuk kelemahan RFC kecil. Klien yang cukup jahat tidak akan peduli tentang kode status yang dikembalikan kecuali secara insidentil. Orang akan tahu itu adalah halaman pengguna tersembunyi (atau halaman pengguna potensial yang tersembunyi) dengan membandingkannya dengan halaman pengguna lain yang dikenal.
Yaitu, katakanlah pawang Anda
users/*
. Jika saya tahuusers/foo
,users/bar
danusers/baaz
pekerjaan, server mengembalikan401
,403
atau404
untukusers/quux
tidak berarti aku tidak akan mencobanya, terutama jika saya punya alasan untuk percaya ada adalah sebuahquux
pengguna. Skenario contoh standar adalah Facebook: profil saya pribadi, tetapi komentar saya tentang profil publik tidak. Klien jahat tahu saya ada meskipun Anda kembali404
ke halaman profil saya.Jadi kode status bukan untuk kasus penggunaan berbahaya, itu untuk klien yang bermain sesuai aturan. Dan untuk klien - klien itu, suatu
401
atau404
permintaan adalah yang paling tepat.sumber
quux
ada. Tetapi tidak akan selalu ada bukti eksternal, terutama di situs non-sosial di mana data klien benar - benar pribadi . Sebuah usil atau bermusuhan pengguna akhirnya mungkin bisa menyimpulkan bahwa Anda berbaring, tetapi belum tentu yang sumber daya yang Anda berbohong tentang . Saya pikir poin penting di sini adalah benar-benar, jangan repot-repot untuk sumber daya 404 kecuali tidak ada metode penemuan lain yang tersedia.Menurut RFC2616
juga perhatikan bahwa ketika mengakses sumber daya Terlarang, otorisasi tidak akan membantu .
sumber
HttpUnauthorizedResult
yang dimaksudkan untuk digunakan sebagai sumber daya istimewa. . Saya juga menyadari (jelas) bahwa 404 dapat digunakan sebagai gantinya; pertanyaan saya adalah apakah harus digunakan atau tidak , dan apa yang harus dipertimbangkan ketika membuat keputusan itu.Seharusnya kamu? Ya .
Anda mengatakannya sendiri, mengkhianati sesedikit mungkin. Jika saya menyerang sistem dan melihat server merespons dengan 403 kode saya akan fokus pada mereka, daripada pindah. Lebih baik sebuah pintu menyatakan itu tidak ada kemudian mengumumkannya untuk dilarang.
Kelemahan dari menggunakan 404 permintaan adalah bahwa secara eksternal akan muncul seolah-olah halaman tidak ada, dan ini bisa memiliki konflik bila dibandingkan dengan halaman yang seharusnya ada tetapi malah hilang. Jika Anda tidak khawatir tentang perayap web (sistem terotentikasi harus sepenuhnya ditolak), maka Anda harus benar-benar melakukannya. Setiap API yang saya tangani memiliki akses tidak sah dengan cara yang sama persis, dan begitu pula StackOverflow . Tidak bisa melihat halaman itu? Saya yakinkan Anda itu memang ada, meskipun ia mengaku tidak.
Anda harus mengakui permintaan ketika sumber daya diketahui ada dan akses ditolak. Gagal masuk seharusnya tidak menghasilkan pesan 404. Anda seharusnya tidak mengakui permintaan ketika keberadaan sumber daya itu sendiri harus dilindungi. Akses ke ranah ada di publik, tetapi grup keamanan atau peran di dalamnya tidak.
Pengembang harus memiliki akses ke log, yang akan mengindikasikan upaya untuk mengakses sumber daya yang dilindungi. Pelanggan / Pengguna / Penguji akan menghasilkan umpan balik yang pada akhirnya akan mengenai pengembang.
Ini bukan keamanan karena ketidakjelasan. Anda menggunakan ketidakjelasan selain langkah-langkah keamanan yang tepat.
Mereka bukan permintaan yang valid, itu adalah permintaan yang tidak sah . Anda mengubah sebagian kecil (mengembalikan 404 bukannya 403) untuk mendapatkan keuntungan besar pada calon penyerang.
sumber
Itu benar-benar tergantung pada informasi yang diberikan oleh kode status 403. Jika Anda memiliki titik akhir API merespons
GET /myresource/{id}
dengan 404 ketika sumber daya tidak ada, maka kode status dikembalikan oleh titik akhir ketika sumber daya ada tetapi tidak diotorisasi untuk pengguna saat ini harus bergantung pada prediktabilitasid
parameter, dan jumlah informasi yang dikandungnya dengan sendirinya.id
bidang pribadi seperti alamat email atau nomor rekening bank, mungkin harus selalu disembunyikan di belakang angka 404. Dalam kasus alamat email, bidang tersebut dapat mencegah bot spam dari menyusun daftar alamat email yang valid yang terdaftar di situs web Anda.id
adalah nama pengguna publik, jangan repot-repot, ada cara lain untuk mendapatkan akses ke informasi ini (seperti, hanya dengan menjelajahi halaman forum situs web Anda).id
bersifat buram, tetapi pengidentifikasi yang dapat diprediksi (mis. Bilangan bulat yang bertambah secara otomatis), Anda tidak memberikan informasi apa pun kepada penyerang yang tidak dapat ia peroleh dengan cara lain. Jadi menurut saya aman untuk mengembalikan kode status 403.id
pengidentifikasi buram dan tidak dapat diprediksi (seperti GUID acak), pertanyaannya lebih halus. Saya pribadi berpikir tidak ada masalah dalam mengembalikan kode status 403. Informasi ini hanya dapat dieksploitasi jika ada titik akhir cacat lain di API Anda menggunakan ID ini, tetapi cacat sebenarnya adalah titik akhir Anda yang lain.Anda mungkin menganggap lebih baik aman daripada menyesal dalam hal apa pun dan menyembunyikan informasi apa pun konteksnya, tetapi Anda sebenarnya tidak bisa mengandalkan jenis perilaku ini untuk menyediakan segala bentuk keamanan . Di sisi lain, ini dapat memberikan kerahasiaan (atau privasi, seperti yang dikatakan orang lain).
Mekanisme keamanan seharusnya tidak hanya menjadi gundukan cepat bagi penyerang, jika tidak, itu hanya sia-sia. Dalam hal ini, bahkan mungkin mencegah Anda menggunakan fitur lain dengan benar (crawler, Aplikasi Web Firewall mencari jumlah abnormal 403 kode status untuk memblokir pengguna ...).
sumber