Apakah mengaburkan / mengaburkan basis data yang menghadap publik benar-benar merupakan "praktik terbaik"?

23

Saya pernah mendengar orang-orang memberi ceramah di sana-sini di internet bahwa praktik terbaik untuk mengaburkan id database yang dihadapkan kepada publik dalam aplikasi web. Saya kira mereka terutama berarti dalam bentuk dan url, tetapi saya tidak pernah membaca lebih dari satu suap tentang subjek.

EDIT : Tentu saja, sekarang saya bertanya ini, saya menemukan beberapa sumber pada subjek:

Tautan ini memuaskan beberapa keingintahuan saya, tetapi posting SO tidak memiliki banyak suara dan tidak selalu berpusat di sekitar topik dalam konteks ini jadi saya tidak yakin apa yang harus dilakukan, dan beberapa dari mereka mengklaim bahwa yang ketiga tautannya palsu. Saya akan membiarkan sisa postingan saya tetap utuh:


Saya memahami perbedaan antara ketidakjelasan dan keamanan, serta bagaimana keduanya dapat bekerja bersama, tetapi saya tidak bisa membayangkan mengapa ini perlu.

Apakah ada kebenaran dalam hal ini, apakah itu hanya paranoia, atau sama sekali palsu?

Saya bisa memikirkan cara untuk melakukannya, tetapi tentu saja itu menambah banyak kerumitan pada kode aplikasi. Dalam keadaan apa ini berguna? Jika ini adalah sesuatu yang sering dilakukan orang, bagaimana biasanya digunakan? Memukul pengidentifikasi? Sesuatu yang lain Sepertinya banyak pekerjaan untuk keamanan ekstra. Saya tidak mencari solusi nyata, saya hanya ingin mendapatkan ide tentang bagaimana / mengapa orang melakukan ini di dunia nyata.

Apakah ini benar-benar dianggap sebagai "praktik terbaik" atau itu hanya optimasi mikro bernilai kecil?

CATATAN : Saya pikir beberapa orang mungkin mendapat ide yang salah: Saya tidak menyarankan bahwa id yang sulit ditebak akan menjadi satu - satunya mekanisme keamanan, jelas akan ada pemeriksaan akses yang biasa. Mari kita asumsikan itu sudah ada, dan bahwa sekadar mengetahui id atau id hash dari sebuah catatan saja tidak cukup untuk memberikan akses.

Wesley Murch
sumber

Jawaban:

28

Saya tidak berpikir itu penting, tetapi ada beberapa skenario ketika itu bisa jadi masalah tergantung pada keputusan lain yang Anda buat.

Misalnya, jika Anda mengekspos ID pesanan yang dihasilkan secara berurutan, dan Anda mengalami serangan rekayasa sosial dengan seseorang yang menghubungi dukungan pelanggan dan berkata "hei, saya baru saja menghabiskan $ 2000 untuk komputer baru dan kalian mengirim saya pesanan orang lain untuk kabel $ 15, sekarang saya keluar $ 2000 "Anda bisa menghabiskan banyak waktu untuk mencoba masalah sebelum Anda menyimpulkan itu palsu atau Anda mengirim faker komputer baru.

Ada variasi yang serupa, kurang canggih, tetapi memalukan pada tema; jika orang jahat menambah ID pesanan, tautan yang dikirim melalui email ke tanda terima, dan jika tidak ada validasi tambahan dilakukan untuk memverifikasi bahwa orang yang mengklik tautan memiliki hak untuk melihat ID pesanan, tiba-tiba Anda tanpa disadari membuka informasi pelanggan pribadi kepada orang yang salah.

Dalam kasus seperti itu, jika angkanya tidak berurutan, eksposur sedikit dikurangi karena menebak cenderung menghasilkan hasil yang menarik. Di sisi lain, sekarang Anda memerlukan cara yang mudah untuk merujuk ID pesanan dalam interaksi dukungan pelanggan yang tidak akan menghasilkan percakapan bolak-balik dengan interaksi pelanggan berbasis telepon sementara perwakilan Anda mencoba untuk membedakan antara B, PD dan T dalam nomor pesanan BPT2015D.

Saya akan mengatakan ini sulit untuk menyebut kebingungan ini sebagai "praktik terbaik", tetapi dalam skenario tertentu, ini dapat mengurangi kemudahan mengeksploitasi kelemahan lain dalam kode validasi atau otorisasi Anda. Di sisi lain, tidak masalah apakah seseorang tahu Anda menulis posting blog # 1 atau # 2559. Jika ID bukan informasi yang berharga, bahkan dengan pengetahuan tambahan, maka argumen yang mengaburkannya adalah praktik terbaik menahan bobot lebih sedikit.

Ada argumen potensial kedua, yaitu bahwa pengenal basis data Anda dapat mengawinkan Anda dengan implementasi basis data tertentu (atau contoh), dan ketika perusahaan Anda dibeli atau mengambil pesaing dan sekarang Anda harus menggabungkan dua sistem warisan, atau CEO keluar minum dengan perwakilan dari DynoCoreBase dan mereka memutuskan bahwa Anda sekarang akan memindahkan semua data Anda ke DynoCoreBase versi 13h dan ingin semua kunci utama menjadi panduan, dan Anda harus membuat semacam lapisan pemetaan untuk menerjemahkan ID lama menjadi baru ID sehingga URL lama tidak rusak, tetapi apakah skenario ini penting bagi Anda lebih tergantung pada sifat bisnis Anda (dan keterlibatan pelanggan dengan ID tersebut) daripada pada praktik terbaik umum lainnya.

Jason True
sumber
2
Aku merasa hanya kamu satu-satunya yang mengerti pertanyaanku. Itu pasti dapat "mengurangi kemudahan mengeksploitasi kelemahan lain" seperti yang Anda katakan, tetapi apa nilainya? Adakah orang yang bertekad untuk menunda-nunda sesuatu seperti hash asin? Saya agak berpikir ini lebih merupakan teknik "profesional tepi", tetapi saya tidak melihatnya dalam praktek (atau mungkin saya tidak akan melihat jika saya melakukannya ...). Seperti yang Anda katakan, mengetahui id saja tidak boleh memberikan akses (saya pikir beberapa orang melewatkan bagian itu, saya menganggapnya wajar). Jadi, saya pikir saya setuju dengan penilaian umum Anda.
Wesley Murch
9

Ini adalah pendapat saya:

Sementara "keamanan melalui ketidakjelasan" jelas tidak cukup, ketidakjelasan dapat membantu keamanan, meskipun hanya sedikit. Anda harus memutuskan apakah sedikit keamanan psuedo sepadan dengan usaha ekstra yang diperlukan untuk menggunakan sesuatu seperti ini di aplikasi Anda.

Ada alasan lain di luar keamanan yang dapat saya pikirkan untuk mengimplementasikan ini:

Pribadi

Katakanlah kita sedang berurusan dengan id pengguna di url. Jika id pengguna Joe adalah 100dan id pengguna Bob adalah 101, mungkin jelas bahwa akun Joe dibuat terlebih dahulu. Meskipun ini mungkin tidak masalah di sebagian besar aplikasi, itu mungkin penting untuk beberapa. Ini adalah contoh privasi yang sangat ketat melalui ketidakjelasan, jadi kecuali Anda memiliki sistem yang sangat canggih untuk mengaburkan id pengguna, mungkin cukup mudah untuk dibubarkan dan mencari tahu apakah pengguna dengan id 3Js9kW3hTs7sa120memiliki akun lebih lama daripada pengguna dengan id Q8Hs73kks0hEg.

Dari tautan yang saya rujuk:

Yang pertama adalah bahwa diberikan URL untuk beberapa objek, Anda dapat mengetahui URL untuk objek yang dibuat di sekitarnya. Ini memaparkan jumlah objek dalam database Anda ke kemungkinan pesaing atau orang lain yang mungkin tidak Anda inginkan memiliki informasi ini (seperti yang diperlihatkan oleh pihak Sekutu yang menebak tingkat produksi tank Jerman dengan melihat nomor seri.)

Menggunakan id kenaikan-otomatis secara publik memperlihatkan jumlah objek dalam database, dan dapat mengekspos mana yang dibuat terlebih dahulu dan mana yang lebih baru. Informasi ini dapat memberikan fakta bahwa bisnis itu baru, atau bahkan tidak berjalan dengan baik. Misalnya: katakanlah Anda memesan buku dan id pesanan Anda 1. Mungkin terlihat jelas bahwa pesanan Anda adalah yang pertama dalam sistem, yang dapat membingungkan. Katakanlah Anda kembali dan memesan yang lain dan nomor pesanan Anda 9. Ini memberikan informasi bahwa hanya 7 pesanan ditempatkan dalam kerangka waktu antara dua pesanan Anda. Ini mungkin informasi yang berharga bagi para pesaing. Dalam hal ini, id peningkatan otomatis numerik mungkin lebih baik dikaburkan.

Wesley Murch
sumber
2

Kata "Obscure" mungkin sedikit menyesatkan di sini, dan, dapat menyebabkan orang berpikir "mengaburkan" atau "menyembunyikan sebagian".

Rekomendasi ini adalah bahwa Anda tidak pernah memasukkan kunci basis data yang dihasilkan secara internal sebagai bagian dari URL publik jika catatan basis data ini berisi data sensitif apa pun.

Terlalu mudah untuk bermain dengan angka-angka di URL dan mengakses catatan lain.

James Anderson
sumber
1
Ya, maksud saya mengaburkan dalam judul dan beberapa contoh lainnya - maaf tentang itu. Senang Anda tahu apa yang saya maksudkan. Saya mengerti tentang "bermain dengan angka-angka" tapi itu maksud saya - aplikasi Anda seharusnya tidak dilindungi dengan membuat id sedikit lebih sulit untuk ditebak dan disilangkan. Jika seseorang mendarat /account/8hdy39s1lks062dfasd4dan memetakannya ke akun nyata, mereka seharusnya tidak memiliki akses lagi.
Wesley Murch
2

Saya akan menentang arus utama, dan memberi tahu Anda bahwa menggunakan pengenal acak yang panjang menurut saya merupakan bentuk keamanan yang cukup baik.

Harus jelas bagi siapa pun yang memiliki akses ke data tersebut yang sama sensitifnya dengan kata sandi. Dan tentu saja itu memiliki kelemahan bahwa jika ia pergi ke alam liar mungkin lebih sulit untuk berubah.

Tetapi memiliki beberapa keunggulan dibandingkan pasangan nama pengguna dan kata sandi yang biasa. Pertama, pengguna tidak punya pilihan untuk itu, jadi Anda bisa yakin pada dasarnya tidak mungkin untuk menebak. Tidak ada gunanya merancang situs yang sepenuhnya aman ketika administrator memilih nama depannya sebagai kata sandi. Kedua, setiap item memiliki pengidentifikasi yang berbeda, jadi jika satu mendapatkan akses ke satu item, ini tidak membantu yang lainnya.

Tentu saja, semakin banyak lapisan keamanan, semakin baik. Tetapi metode ini saja bisa lebih aman daripada beberapa kredensial.

Andrea
sumber
1
Saya setuju. Apa pun metode keamanan yang Anda gunakan, ia harus mengirim byte yang tidak dapat ditebak melalui kabel. Jika dilakukan dengan benar, Anda mengirim ID yang sama baiknya dengan yang dienkripsi, yang tidak membocorkan informasi apa pun tentang ruang ID Anda, dan saya berpendapat bahwa itu lebih kuat daripada apa yang orang gunakan bicarakan ketika mereka menggeser "keamanan melalui ketidakjelasan. "
Marc Stober
0

Ada dua aspek untuk ini: kegunaan dan keamanan.

Dari sisi keamanan, ID yang tersembunyi agak tidak ada gunanya; yang penting adalah bahwa ID tidak boleh menjadi satu-satunya 'kunci' untuk sumber daya non-publik. Ini berarti bahwa jika Anda ingin memberikan pengguna terpilih akses ke halaman tertentu, hanya membutuhkan ID halaman dalam URL tidak cukup, Anda harus menerapkan mekanisme keamanan yang sebenarnya seperti login nama pengguna / kata sandi atau otentikasi kunci publik / pribadi, serta otorisasi yang tepat (yaitu, sistem harus dapat menilai berdasarkan per kasus apakah pengguna X diizinkan untuk mengakses sumber daya Y, dan bertindak sesuai).

Dari segi kegunaan, saran umum adalah menjaga kunci buatan tetap tersembunyi: mereka tidak memiliki arti bagi pengguna, dan dengan mengungkapkannya dengan cara yang jelas, Anda memperkenalkan ketergantungan ekstra, yang sangat sulit untuk ditangani karena tinggal di luar ranah perangkat lunak - orang-orang akan menulis, mengirim surel, mengirim faks, mencetak, membookmark, dll. ID itu, dan jika Anda pernah mengubahnya, Anda akan mendapat tiket dukungan yang mengganggu.

tammmer
sumber
Dalam aplikasi web saya tidak dapat memikirkan contoh di mana orang akan menulis id internal karena alasan apa pun. Mengirim URL melalui email atau sesuatu (atau menandai) yang memiliki id dapat saya mengerti, tetapi dalam hal ini saya tidak melihat di mana kegunaannya. Saya tidak menyarankan untuk mengubahnya di tengah-tengah, tetapi saya mengambil pendapat Anda tentang bagaimana itu akan menjadi masalah.
Wesley Murch
@ Madmartigan: Tidak jarang dengan sistem informasi khusus. Pengguna perlu melakukan hal-hal tertentu, dan kadang-kadang aplikasi tidak cukup mendukung mereka secara langsung, atau jelas rusak, atau mungkin melalui ID secara langsung lebih mudah daripada menempuh rute yang direncanakan oleh arsitek perangkat lunak. Orang-orang dapat menjadi sangat kreatif dengan hal-hal ini, dan sebelum Anda tahu, ID 'internal' itu mulai menjalani kehidupan mereka sendiri.
tdammers
0

Tidak , Anda tentu saja, secara positif tidak ingin mengizinkan akses ke sumber daya yang sewenang-wenang hanya dengan mengetahui id internal mereka. Ini adalah internet, apa pun kehadiran kekanak-kanakan yang jahat, kriminal, atau polos yang mungkin Anda bayangkan ada, sebenarnya ada , dan cepat atau lambat mereka akan datang ke situs Anda. Kecuali jika semua yang Anda bisa layani sepenuhnya publik untuk semua orang (dan jika Anda memiliki satu pelanggan, itu dijamin tidak akan menjadi masalah), Anda harus membatasi akses ke mereka yang benar-benar berwenang untuk memilikinya.

Solusi yang biasa adalah dengan menggunakan token otorisasi dari beberapa jenis yang disimpan dalam sesi terenkripsi, dan memeriksa yang memverifikasi apakah sesuatu seharusnya terlihat oleh pengguna yang diautentikasi sebelum benar-benar mengirimkannya. Ini bisa menjadi manajer keamanan yang sebenarnya, seperti yang dikirimkan bersama JDK, atau komponen lain yang memenuhi peran yang sama, selama hal itu dilakukan secara konsisten. (Apakah membuka ID internal kepada seseorang yang sudah diautentikasi atau tidak juga merupakan pertanyaan yang menarik dengan berbagai pro dan kontra, tetapi itu kurang penting untuk keamanan.)

Nilai melakukan ini sulit untuk dihitung sampai Anda benar-benar diserang oleh seseorang yang berarti bisnis. Maka biasanya perbedaan antara keluar dari bisnis dan hanya mengabaikan kiddie script digagalkan lagi.

Kilian Foth
sumber
2
Saya pikir Anda mungkin mendapat ide yang salah, saya tidak menyarankan "mengizinkan akses ke sumber daya yang sewenang-wenang hanya dengan mengetahui id internal mereka", saya berbicara tentang mengaburkan id di atas langkah-langkah keamanan yang ada. Jelas, hanya mengetahui id atau hash tidak boleh dianggap sebagai otorisasi.
Wesley Murch
0

Jelas itu tergantung pada seberapa sensitif data tetapi untuk keamanan menengah yang paling minimum yang akan saya lakukan adalah memasukkan ID dan nilai checksum.

Hasilkan checksum dengan menambahkan garam (yaitu kumpulan kumpulan karakter acak) sebelum dan sesudah ID dan melakukan MD5 pada nilainya.

Pada setiap halaman yang membaca nilai ID itu harus menghasilkan nilai checksum dan membandingkannya dengan yang berlalu, menolak permintaan jika tidak cocok.

Jika seorang peretas potensial dapat memperoleh kombinasi yang cukup valid maka mereka mungkin dapat menentukan nilai Salt dengan kekerasan, jadi jika Anda dapat menambahkan lapisan keamanan lain seperti memeriksa User ID yang juga akan membantu.

Pembuat Kode PHP
sumber