Mengekspos kunci utama Anda (terutama jika dapat diprediksi) adalah kerentanan yang disebut Referensi Objek Langsung Tidak Aman.
Dengan memiliki URL (atau param lain yang disediakan klien) seperti ini:
http://www.domain.com/myaccount?userid=12
Anda memberi pengguna akhir Anda kesempatan untuk mengacaukan variabel-variabel itu dan meneruskan data apa pun yang mereka suka. Tindakan balasan untuk mengurangi kerentanan ini adalah dengan membuat referensi objek tidak langsung. Ini mungkin terdengar seperti perubahan besar, tetapi tidak harus demikian. Anda tidak perlu pergi dan mengetik ulang semua tabel Anda atau apa pun, Anda dapat melakukannya hanya dengan menjadi pintar dengan data Anda melalui penggunaan peta referensi tidak langsung.
Pertimbangkan ini:Anda memiliki pengguna yang melakukan pembelian di situs Anda. Dan ketika tiba waktunya untuk membayar mereka disajikan dengan drop-down dari nomor kartu kredit mereka yang Anda "di file". Jika Anda melihat kode untuk drop down, Anda melihat bahwa nomor kartu kredit terkait dengan kunci 8055, 9044, dan 10099.
Pengguna mungkin melihat ini dan berpikir bahwa mereka sangat mirip dengan kunci utama yang bertambah secara otomatis (pengguna mungkin benar). Jadi dia mulai mencoba kunci lain untuk melihat apakah dia bisa membayar dengan kartu orang lain.
Sekarang secara teknis, Anda harus memiliki kode di sisi server yang memastikan bahwa kartu yang dipilih adalah bagian dari akun pengguna dan mereka dapat menggunakannya. Ini adalah contoh yang dibuat-buat. Untuk saat ini kami akan berasumsi bahwa ini bukan masalahnya atau ini adalah jenis formulir lain yang mungkin tidak memiliki kontrol sisi server semacam itu.
Jadi bagaimana kita mencegah pengguna akhir memilih kunci yang seharusnya tidak tersedia untuk mereka?
Alih-alih menunjukkan referensi langsung ke catatan di DB, beri mereka referensi tidak langsung.
Alih-alih meletakkan kunci DB ke dalam dropdown, kita akan membuat array di server dan memasukkannya ke dalam sesi pengguna.
Array cards = new Array(3);
cards[0] = 8055;
cards[1] = 9044;
cards[2] = 10099;
Dalam drop down kami sekarang memberikan referensi ke indeks array tempat kartu disimpan. Jadi, alih-alih melihat kunci yang sebenarnya, pengguna akhir akan melihat nilai 0, 1 dan 2, jika mereka melihat sumbernya.
Ketika formulir dikirimkan, salah satu dari nilai-nilai itu akan diteruskan. Kemudian kita mengeluarkan array dari sesi pengguna dan menggunakan indeks untuk mendapatkan nilainya. Kunci yang sebenarnya tidak pernah meninggalkan server.
Dan pengguna dapat meneruskan nilai yang berbeda sepanjang hari jika dia mau, tetapi dia tidak akan pernah mendapatkan hasil selain kartunya sendiri, terlepas dari kontrol akses sisi server yang ada.
Ingatlah bahwa ketika menggunakan indeks yang diteruskan untuk mendapatkan nilai bahwa jika pengguna mengacaukannya, Anda bisa mendapatkan beberapa pengecualian (ArrayOutOfBounds, InvalidIndex, apa pun). Jadi bungkus hal-hal itu dalam coba/tangkap sehingga Anda dapat menekan kesalahan itu dan mencatat kegagalan untuk mencari upaya cracking.
Semoga membantu.
Untuk membaca lebih lanjut tentang Referensi Objek Langsung Tidak Aman, lihat 10 Teratas OWASP. Ini adalah risiko nomor A4. https://www.owasp.org/index.php/Top_10_2010-A4 -Insecure_Direct_Object_References