Mengekspos ID basis data - risiko keamanan?

134

Saya pernah mendengar bahwa mengekspos ID database (dalam URL, misalnya) adalah risiko keamanan, tetapi saya mengalami kesulitan memahami alasannya.

Adakah pendapat atau tautan tentang mengapa itu berisiko, atau mengapa tidak?

EDIT: tentu saja aksesnya mencakup, misalnya jika Anda tidak dapat melihat sumber daya foo?id=123Anda akan mendapatkan halaman kesalahan. Kalau tidak, URL itu sendiri harus dirahasiakan.

EDIT: jika URL itu rahasia, itu mungkin akan berisi token yang dihasilkan yang memiliki masa hidup terbatas, misalnya valid untuk 1 jam dan hanya dapat digunakan sekali.

EDIT (berbulan-bulan kemudian): Praktik pilihan saya saat ini untuk ini adalah menggunakan UUIDS untuk ID dan mengeksposnya. Jika saya menggunakan nomor urut (biasanya untuk kinerja pada beberapa DB) sebagai ID saya suka membuat token UUID untuk setiap entri sebagai kunci alternatif, dan memaparkannya.

orip
sumber

Jawaban:

109

Mengingat kondisi yang tepat, mengekspos pengidentifikasi bukan risiko keamanan. Dan, dalam praktiknya, akan sangat memberatkan untuk merancang aplikasi web tanpa mengekspos pengidentifikasi.

Berikut adalah beberapa aturan yang baik untuk diikuti:

  1. Gunakan keamanan berbasis peran untuk mengontrol akses ke operasi. Cara ini dilakukan tergantung pada platform dan kerangka kerja yang Anda pilih, tetapi banyak yang mendukung model keamanan deklaratif yang secara otomatis akan mengarahkan ulang peramban ke langkah otentikasi ketika suatu tindakan memerlukan otoritas.
  2. Gunakan keamanan terprogram untuk mengontrol akses ke suatu objek. Ini lebih sulit dilakukan di tingkat kerangka kerja. Lebih sering, ini adalah sesuatu yang harus Anda tulis ke dalam kode Anda dan karena itu lebih rentan kesalahan. Pemeriksaan ini melampaui pengecekan berbasis peran dengan memastikan tidak hanya bahwa pengguna memiliki otoritas untuk operasi, tetapi juga memiliki hak yang diperlukan pada objek tertentu yang sedang dimodifikasi. Dalam sistem berbasis peran, mudah untuk memeriksa bahwa hanya manajer yang dapat memberikan kenaikan gaji, tetapi di luar itu, Anda perlu memastikan bahwa karyawan tersebut termasuk dalam departemen manajer tertentu.
  3. Untuk sebagian besar catatan database, kondisi 1 dan 2 sudah cukup. Tetapi menambahkan ID yang tidak dapat diprediksi dapat dianggap sebagai asuransi tambahan, atau "keamanan mendalam," jika Anda menyetujui gagasan itu. Satu tempat di mana pengidentifikasi yang tidak dapat diprediksi adalah suatu keharusan, bagaimanapun, adalah dalam ID sesi atau token otentikasi lainnya, di mana ID itu sendiri mengotentikasi permintaan. Ini harus dihasilkan oleh RNG kriptografi.
erickson
sumber
27
IMO, menambahkan ID yang tidak dapat diprediksi adalah pendekatan "keamanan melalui ketidakjelasan" dan dapat menyebabkan rasa aman yang salah. Lebih baik fokus pada (1) dan (2) dan pastikan kontrol akses Anda solid.
stucampbell
4
Menggunakan RNG kriptografi jelas bukan "keamanan melalui ketidakjelasan." Penyerang tidak lebih dekat dengan menebak pengidentifikasi objek bahkan ketika dia tahu bagaimana Anda menghasilkan mereka. Keamanan melalui ketidakjelasan berarti bahwa jika algoritma yang Anda gunakan ditemukan, maka dapat dieksploitasi. Itu tidak merujuk pada menyimpan rahasia, seperti kunci atau keadaan internal RNG.
erickson
1
@stucampbell Mungkin, tetapi itu tidak berarti bahwa Anda tidak boleh menggunakan ID yang tidak dapat diprediksi sama sekali. Bug terjadi, jadi ID yang tidak dapat diprediksi adalah mekanisme keamanan ekstra. Selain itu, kontrol akses bukan satu-satunya alasan untuk menggunakannya: ID yang dapat diprediksi dapat mengungkapkan informasi sensitif seperti jumlah pelanggan baru dalam jangka waktu tertentu. Anda benar-benar tidak ingin membuka informasi seperti itu.
user247702
1
@Stijn Anda tidak dapat mengatakan bahwa saya “benar-benar tidak ingin” mengungkapkan berapa banyak pelanggan yang saya miliki. Maksud saya McDonald's memiliki tanda besar yang mengatakan bahwa mereka telah melayani 10 miliar hamburger. Itu sama sekali bukan risiko keamanan, itu adalah preferensi. Selain itu, Anda harus masuk sebelum melihat URL apa saja di sebagian besar aplikasi di mana kami akan mengkhawatirkannya. Oleh karena itu kita akan tahu siapa yang mengumpulkan data.
Wayne Bloss
1
Satu hal yang saya tidak lihat disebutkan dalam percakapan ini adalah bahwa dari sudut pandang pemecahan masalah dan kemudahan penggunaan, akan sangat berguna untuk memiliki ID yang terbuka di url untuk membantu mengarahkan pengguna ke sumber daya tertentu atau membuatnya dapat untuk memberi tahu Anda dengan tepat sumber daya apa yang mereka lihat. Anda sebagian besar dapat menghindari masalah intelijen bisnis dengan memulai kenaikan otomatis pada nilai yang lebih tinggi, hanya untuk menawarkan satu ide.
Chockomonkey
47

Meskipun bukan risiko keamanan data, ini benar-benar risiko keamanan intelijen bisnis karena memaparkan ukuran dan kecepatan data. Saya telah melihat bisnis dirugikan oleh ini dan telah menulis tentang anti-pola ini secara mendalam. Kecuali jika Anda hanya membangun eksperimen dan bukan bisnis, saya sangat menyarankan untuk menjaga id pribadi Anda dari perhatian publik. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e

Peter
sumber
4
Akhirnya, jawaban yang waras membawa aspek lain selain risiko keamanan.
peceps
2
Ini harus menjadi jawaban yang diterima. Jika Anda berasumsi bahwa penyerang dapat melewati keamanan Anda (yang harus selalu Anda lakukan), Anda tidak ingin hanya menyerahkan informasi semacam ini.
Kriil
@ Kerri Mereka bahkan tidak perlu melewati keamanan Anda. Mereka hanya perlu membuat akun!
Peter
32

Tergantung pada apa ID berdiri.

Pertimbangkan sebuah situs yang karena alasan kompetitif tidak ingin mempublikasikan berapa banyak anggota yang mereka miliki tetapi dengan menggunakan ID berurutan tetap mengungkapkannya di URL: http://some.domain.name/user?id=3933

Di sisi lain, jika mereka menggunakan nama login pengguna sebagai gantinya: http://some.domain.name/user?id=some mereka belum mengungkapkan apa pun yang belum diketahui pengguna.

beberapa
sumber
2
jika Anda menggunakan ID berurutan Anda benar, tetapi jika tidak maka itu tidak memperlihatkan apa pun
orip
@orip: Seperti yang saya katakan, itu tergantung pada apa yang seseorang dapat temukan dengan memeriksa beberapa id. Apakah ada polanya? Bisakah mereka menggunakan informasi itu untuk mendapatkan informasi yang tidak seharusnya mereka miliki?
beberapa
@ John: Terima kasih atas hasil editnya. Bahasa Inggris bukan bahasa ibu saya :)
beberapa
6
Saya telah melakukan hal ini: menggunakan nomor ID berurutan untuk menentukan ukuran basis pengguna pesaing.
Micah
3
Mereka ada dimana-mana. Banyak pembeli menggunakan nomor berurutan untuk nomor pesanan. Tempatkan satu pesanan pada satu tanggal, dan satu pada tanggal lainnya dan Anda tahu berapa banyak pesanan yang mereka dapatkan selama periode itu. Sekalipun Anda tidak tahu berapa banyak uang yang dipesan, Anda masih mendapatkan indikasi seberapa baik bisnis berjalan.
Beberapa
25

Pikiran umum sejalan dengan ini: "Ungkapkan sedikit informasi tentang cara kerja aplikasi Anda kepada siapa pun."

Mengekspos ID basis data dianggap sebagai pengungkapan beberapa informasi.

Alasan untuk ini adalah bahwa peretas dapat menggunakan informasi apa pun tentang cara kerja aplikasi Anda untuk menyerang Anda, atau pengguna dapat mengubah URL untuk masuk ke database yang ia seharusnya tidak melihatnya?

Arjan Einbu
sumber
1
Mengakses sumber daya yang tidak seharusnya mereka lihat - hanya jika saya tidak memeriksa izin (yang saya lakukan, jika tidak saya memiliki masalah keamanan yang berbeda). Mengungkapkan informasi tentang "pekerjaan dalam" - itulah pertanyaan saya. Mengapa ini menjadi masalah?
orip
8
@orip: Semuanya tentang seaman mungkin. Jika Anda adalah tipe programmer yang tidak melakukan kesalahan, maka itu bukan masalah. Kalau tidak, mengekspos lebih sedikit detail akan membuat lebih sulit untuk mengeksploitasi kode Anda jika (ketika) Anda melakukan kesalahan. Dengan sendirinya, Anda benar, itu tidak menambah keamanan.
Adam Bellaire
@ Adam: keamanan dangkal bisa lebih buruk daripada tidak ada keamanan. Tanpa keamanan Anda eksplisit, dengan keamanan dangkal Anda bisa berpikir itu menambah sesuatu yang tidak dapat diabaikan.
orip
16

Kami menggunakan GUID untuk id basis data. Membocorkannya jauh lebih tidak berbahaya.

Joshua
sumber
Inilah yang akan saya sarankan. Lot lebih kecil kemungkinan untuk menebak GUID di basis data Anda.
Jon Erickson
6
Ini datang pada penalti kinerja. Lihat di sini
Jeshurun
2
Hal yang menarik 1 tentang menggunakan panduan adalah bahwa Anda dapat membiarkan klien membuat id database. Hal yang menarik 2 adalah bahwa mereka tidak memiliki masalah dengan database sharded seperti yang dilakukan id peningkatan otomatis.
Brian White
Apakah Anda menggunakan GUID ini juga dalam kode html sebagai atribut id untuk mengidentifikasi pengguna, komentar, posting? Untuk menunjukkan tautan mana yang diklik pengguna atau pos mana yang ingin dikomentari?
trzczy
7

Jika Anda menggunakan ID integer di db, Anda dapat membuatnya mudah bagi pengguna untuk melihat data yang seharusnya tidak mereka ubah dengan mengubah variabel qs.

Misalnya seorang pengguna dapat dengan mudah mengubah parameter id dalam qs ini dan melihat / memodifikasi data yang seharusnya tidak mereka http: // someurl? Id = 1

Jason
sumber
7
Jika saya tidak memeriksa izin, saya memiliki masalah keamanan yang berbeda.
orip
tetapi jawabannya akurat: "boleh"
Seun Osewa
1
Pertanyaannya bukan apakah Anda akan memeriksa izin. Itu jika karyawan baru yang tidak Anda kenal akan memeriksa izin.
Brian White
@BrianWhite - itulah sebabnya Anda menginginkan proses peninjauan kode, sehingga Anda dapat mengedukasi mereka sebelum mencapai produksi.
candu
2
Apa yang kami lakukan adalah mengenkripsi id integer ketika digunakan dalam URL atau variabel bentuk.
Brian White
6

Ketika Anda mengirim id database ke klien Anda, Anda dipaksa untuk memeriksa keamanan dalam kedua kasus. Jika Anda menyimpan id di sesi web Anda, Anda dapat memilih jika Anda ingin / perlu melakukannya, yang berarti pemrosesan berpotensi kurang.

Anda terus-menerus mencoba mendelegasikan hal-hal ke kontrol akses Anda;) Ini mungkin terjadi dalam aplikasi Anda, tetapi saya belum pernah melihat sistem back-end yang konsisten sepanjang karier saya. Sebagian besar dari mereka memiliki model keamanan yang dirancang untuk penggunaan non-web dan beberapa memiliki peran tambahan ditambahkan secara anumerta, dan beberapa di antaranya telah dibaut di luar model keamanan inti (karena peran tersebut ditambahkan dalam konteks operasional yang berbeda, katakanlah sebelum web).

Jadi kami menggunakan id lokal sesi sintetik karena menyembunyikan sebanyak yang kami bisa lolos.

Ada juga masalah bidang kunci non-integer, yang mungkin menjadi kasus untuk nilai yang disebutkan dan sejenisnya. Anda dapat mencoba membersihkan data itu, tetapi kemungkinan Anda akan berakhir seperti bobby drop tables .

krosenvold
sumber
4
Menarik, meskipun saya akan berpikir bahwa memeriksa semua input (termasuk parameter URL) untuk setiap permintaan sangat sesuai untuk web.
orip