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:
- /programming/2374538/obscuring-database-ids
- /programming/1895685/should-i-obscure-primary-key-values
- http://joshua.schachter.org/2007/01/autoincrement.html
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.
sumber
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
100
dan id pengguna Bob adalah101
, 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 id3Js9kW3hTs7sa120
memiliki akun lebih lama daripada pengguna dengan idQ8Hs73kks0hEg
.Dari tautan yang saya rujuk:
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 Anda9
. 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.sumber
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.
sumber
/account/8hdy39s1lks062dfasd4
dan memetakannya ke akun nyata, mereka seharusnya tidak memiliki akses lagi.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.
sumber
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.
sumber
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.
sumber
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.
sumber