Semua yang saya lihat pada serangan injeksi SQL tampaknya menunjukkan bahwa permintaan parametrized, terutama yang ada di prosedur tersimpan, adalah satu-satunya cara untuk melindungi terhadap serangan tersebut. Ketika saya bekerja (pada Abad Kegelapan) prosedur tersimpan dianggap sebagai praktik yang buruk, terutama karena mereka dianggap kurang dapat dipertahankan; kurang teruji; sangat berpasangan; dan mengunci sistem menjadi satu vendor; ( pertanyaan ini mencakup beberapa alasan lain).
Meskipun ketika saya sedang bekerja, proyek-proyek sebenarnya tidak menyadari kemungkinan serangan seperti itu; berbagai aturan diadopsi untuk mengamankan database terhadap berbagai macam korupsi. Aturan-aturan ini dapat diringkas sebagai:
- Tidak ada klien / aplikasi yang memiliki akses langsung ke tabel database.
- Semua akses ke semua tabel melalui tampilan (dan semua pembaruan ke tabel dasar dilakukan melalui pemicu).
- Semua item data memiliki domain yang ditentukan.
- Tidak ada item data yang boleh dibatalkan - ini memiliki implikasi yang membuat DBA menggiling gigi mereka kadang-kadang; tetapi ditegakkan.
- Peran dan izin ditetapkan dengan tepat - misalnya, peran terbatas untuk memberikan hanya pandangan hak untuk mengubah data.
Jadi apakah seperangkat aturan (ditegakkan) seperti ini (meskipun tidak harus set khusus ini) merupakan alternatif yang sesuai untuk pertanyaan parametrized dalam mencegah serangan injeksi SQL? Jika tidak, mengapa tidak? Bisakah suatu basis data diamankan dari serangan semacam itu dengan tindakan khusus (hanya) basis data?
EDIT
Penekanan pertanyaan sedikit berubah, mengingat respons awal yang diterima. Pertanyaan dasar tidak berubah.
EDIT2
Pendekatan mengandalkan queri paramaterized tampaknya hanya langkah periferal dalam pertahanan terhadap serangan pada sistem. Tampak bagi saya bahwa pertahanan yang lebih mendasar keduanya diinginkan, dan dapat membuat ketergantungan pada pertanyaan seperti itu tidak perlu, atau kurang kritis, bahkan untuk mempertahankan secara khusus terhadap serangan injeksi.
Pendekatan yang tersirat dalam pertanyaan saya didasarkan pada "menambah" database dan saya tidak tahu apakah itu pilihan yang layak. Penelitian lebih lanjut telah menyarankan bahwa ada pendekatan semacam itu. Saya telah menemukan sumber-sumber berikut yang menyediakan beberapa petunjuk untuk jenis pendekatan ini:
http://database-programmer.blogspot.com
http://thehelsinkideclaration.blogspot.com
Fitur utama yang saya ambil dari sumber-sumber ini adalah:
- Kamus data yang luas, dikombinasikan dengan kamus data keamanan yang luas
- Generasi pemicu, kueri, dan kendala dari kamus data
- Minimalkan Kode dan maksimalkan data
Sementara jawaban yang saya miliki sejauh ini sangat berguna dan menunjukkan kesulitan yang timbul karena mengabaikan pertanyaan yang bersifat paramaterisasi, pada akhirnya mereka tidak menjawab pertanyaan awal saya (sekarang ditekankan dengan huruf tebal).
sumber
Jawaban:
Procs yang disimpan tidak secara otomatis melindungi dari injeksi. Bagaimana dengan ini
Menggunakan query parameterised akan melindungi Anda terhadap injeksi, apakah itu dalam procs atau tidak.
sumber
Tidak, karena mereka memberikan hukuman yang cukup berat pada pengembang. Rincian per item:
Gunakan peran. Klien seharusnya hanya dapat mengakses DB melalui peran terbatas yang hanya memiliki akses SELECT, INSERT, UPDATE, dan DELETE ke tabel tersebut (dan baris, jika mungkin) yang memerlukan akses. Jika Anda ingin memastikan bahwa tidak ada klien yang dapat mengirim spam atau menghapus semua entri, gunakan API untuk modifikasi data.
Itu bisa berupa apa saja, mulai dari yang dapat diabaikan hingga biaya kinerja yang sangat besar, tergantung pada efisiensi pandangan. Kompleksitas yang tidak perlu yang memperlambat pengembangan. Gunakan peran.
Bisa jadi banyak pekerjaan yang harus dipertahankan, dan mungkin harus dinormalisasi menjadi tabel terpisah.
Itu salah sekali. Jika pengembang tidak dapat menangani
NULL
Anda memiliki masalah besar.Anda tidak perlu prosedur tersimpan, cukup gunakan kueri parametrized dengan fungsi yang lolos dari argumen, seperti pg_query_params . Tentu saja, jika basis data Anda dapat ditulisi dunia atau peran klien memiliki akses penuh ke semuanya, Anda tetap kacau. Seseorang harus datang dan menyadari apa yang klien lakukan, dan kemudian memasak klien dalam lima menit yang menghancurkan (atau lebih buruk, racun) DB Anda.
sumber
Saya tidak yakin aturan Anda benar-benar melindungi Anda.
Masalah pertama adalah bahwa Anda menyatakan mereka ditegakkan tetapi, serta datang dengan overhead yang signifikan, saya belum pernah melihat penegakan yang sempurna.
Kedua, pembacaan saya terhadap mereka adalah bahwa aturan seperti ini mungkin membuat hal-hal lebih sulit untuk dieksploitasi tetapi mereka tidak mencegahnya. Misalnya, tidak memiliki akses langsung ke tabel tidak benar-benar berubah banyak jika tampilan memungkinkan Anda untuk mengakses data yang sama. Jika klien perlu melakukan sesuatu, sebuah tampilan perlu memfasilitasi itu dan jika sebuah tampilan memfasilitasinya, fungsi / data yang sama dapat digunakan oleh penyerang.
Ingat juga bahwa ini bukan hanya tentang memperbarui atau menghapus data. Bagian dari kerentanan dengan injeksi SQL adalah pengumpulan informasi dan untuk itu Anda tidak peduli apakah data telah dikembalikan melalui tampilan vCustomers atau tabel Pelanggan yang mendasarinya. Anda mungkin telah melindungi diri dari beberapa kelemahan tetapi tidak semua. Demikian pula jika pembaruan dapat dibuat oleh klien, bahkan jika melalui pemicu, maka SQL dapat ditulis untuk mengaktifkan pemicu dan membuat pembaruan.
(Dalam hal semua pembaruan yang dilakukan melalui pemicu saya akan mengatakan dua hal: (1) ketika saya membaca ini saya sedikit sakit di mulut saya dan (b) Anda tidak suka Prosedur Tersimpan karena mereka ' kembali "kurang dapat dipelihara; kurang dapat diuji; sangat berpasangan; dan mengunci sistem menjadi satu vendor" tetapi Anda memang menggunakan pemicu tentang hal-hal yang sama pada dasarnya dapat dikatakan.)
Yang Anda butuhkan adalah satu lubang yang memungkinkan eksekusi pernyataan SQL (dan saya tidak melihat aturan ini mencegahnya) dan penyerang masuk. Mereka mungkin menemukan database yang sangat tidak intuitif di belakangnya tetapi jika mereka memutuskan bahwa akan hanya memperlambat mereka daripada menghentikannya).
Hal lain di sini adalah Anda juga menambahkan kompleksitas dan (dan juga overhead yang menciptakan), kompleksitas cenderung mengarah pada lubang yang dapat dieksploitasi.
Saya tidak mengatakan bahwa seperangkat aturan seperti itu tidak dapat dibuat - lebih lagi mengapa Anda repot-repot? Mereka tampak lebih rumit dan kurang dapat diandalkan daripada hanya pergi dengan metode yang diterima secara luas untuk mencegah serangan semacam ini.
sumber