Saya telah membaca / menonton banyak konten Robert C. Martin. Saya telah menemukan dia mengatakan SQL tidak perlu karena solid state drive. Ketika saya mencari sumber lain untuk mendukung ini saya mendapatkan banyak artikel acak yang menggambarkan perbedaan kinerja SQL antara hard drive dan solid state drive (yang terkait tetapi tidak apa yang saya coba untuk riset).
Pada akhirnya, saya tidak mengerti apa yang dia coba lakukan. Apakah dia mengatakan mengganti SQL dengan teknologi No-SQL? Apakah dia mengatakan menyimpan data dalam file dalam sistem file? Atau apakah dia hanya ingin orang berhenti menggunakan SQL / Database Relasional karena serangan SQLi? Saya khawatir saya kehilangan poin yang dia coba buat.
Saya akan memberikan beberapa tautan di sini sehingga Anda dapat membaca langsung dari benaknya:
Pertama, ia menyatakan bahwa SQL harus dihapus dari sistem sepenuhnya.
Solusinya. Satu-satunya solusi. Adalah untuk menghilangkan SQL dari sistem sepenuhnya. Jika tidak ada mesin SQL, maka tidak ada serangan SQLi.
Dan meskipun dia berbicara tentang mengganti SQL dengan API, saya TIDAK berpikir dia bermaksud meletakkan SQL di belakang API karena kutipan sebelumnya dan apa yang dia katakan sebelumnya dalam artikel.
Kerangka kerja tidak menangani masalah ini; ...
Catatan: Dengan mengatakan SQL, saya cukup yakin Robert berarti sebagian besar basis data relasional. Mungkin tidak semuanya kecuali kebanyakan. Bagaimanapun, kebanyakan orang menggunakan SQL anyways. begitu...
Jika SQL tidak digunakan untuk menyimpan data, lalu apa yang harus kita gunakan?
Sebelum menjawab itu, saya juga harus perhatikan. Robert menekankan bahwa solid state drive harus mengubah alat yang kami gunakan untuk bertahan data. Jawaban Søren D. Ptæus menunjukkan ini.
Saya juga harus merespons ke grup "tetapi integritas data". Setelah beberapa penelitian lebih lanjut, Robert mengatakan kita harus menggunakan database transaksional seperti datomic . Kemudian CRUD berubah menjadi CR (buat dan baca) dan transaksi SQL hilang sama sekali. Integritas data tentu saja penting.
Saya tidak dapat menemukan pertanyaan yang mencakup semua ini. Saya kira saya sedang mencari alternatif yang sesuai dengan pedoman Robert. Datomic adalah satu tetapi apakah itu? Opsi apa yang cocok dengan pedoman ini? Dan apakah mereka benar-benar bekerja lebih baik dengan solid state drive?
eval(request.GET["table_name"] + ".get(pk=" + request.GET["pk"] + ")"))
. Bukan SQL yang benar-benar salah, tetapi programmer yang buruk dan bodoh.Jawaban:
Bob Martin jelas melebih-lebihkan untuk menegaskan maksudnya. Tapi apa gunanya?
Setahu saya, dalam posting blog itu (tautan pertama Anda), Martin mencoba meyakinkan orang untuk berhenti menggunakan SQL, tetapi bukan basis data relasional. Ini adalah dua hal yang berbeda .
SQL adalah bahasa yang sangat kuat, dan ini distandarisasi sampai tingkat tertentu. Hal ini memungkinkan untuk membuat pertanyaan dan perintah yang kompleks dengan cara yang sangat kompak, dengan cara yang mudah dibaca, dimengerti, mudah dipelajari. Itu tidak tergantung pada bahasa pemrograman lain, sehingga dapat digunakan untuk sebagian besar programmer aplikasi, tidak peduli apakah mereka lebih suka Java, C, C ++, C #, Python, Ruby, JavaScript, Basic, Go, Perl, PHP, atau yang lainnya.
Namun, kekuatan ini dikenakan biaya : menulis query / perintah SQL yang aman lebih sulit daripada menulis yang tidak aman. API yang aman harus memudahkan untuk membuat kueri yang aman "secara default". Yang berpotensi tidak aman harus membutuhkan lebih banyak mental atau setidaknya upaya mengetik. Itulah IMHO mengapa Martin mengomel terhadap SQL dalam bentuk saat ini.
Masalahnya bukan hal baru, dan ada API yang lebih aman daripada SQL standar untuk mengakses database relasional. Misalnya, semua ATAU pemetaan yang saya tahu berusaha menyediakan API semacam itu (meskipun mereka biasanya dirancang untuk tujuan utama lainnya). Varian SQL statis membuatnya sulit untuk membuat kueri dinamis dengan data input yang tidak disanitasi (dan itu bukan penemuan baru: SQL tertanam, yang sering menggunakan SQL statis, berusia sekitar 30 tahun).
Sayangnya, saya tidak mengetahui adanya API yang fleksibel, standar, dewasa, mandiri bahasa dan juga sekuat SQL, terutama SQL dinamis. Itu sebabnya saya memiliki keraguan tentang saran Martin tentang "tidak menggunakan SQL" sebagai cara realistis untuk memecahkan masalah yang disebutkan. Jadi bacalah artikelnya sebagai pemikiran ke arah yang benar, bukan sebagai "praktik terbaik" yang bisa Anda ikuti secara membabi buta mulai besok.
sumber
Pendapat Bob Martin hanya itu; pendapat satu orang.
Seorang programmer diharapkan untuk memahami sistem yang ditulisnya dengan cukup baik untuk melakukan perawatan yang wajar tentang keamanan dan kinerjanya. Itu berarti, jika Anda berbicara dengan database SQL, Anda melakukan apa yang dikatakan situs web Bobby Tables : Anda membersihkan data input Anda. Ini berarti bahwa Anda meletakkan database SQL Anda pada mesin yang menjanjikan kinerja yang memadai. Ada cara-cara yang sangat terkenal dan dipahami untuk melakukan hal-hal ini, dan sementara mereka tidak menjamin keamanan absolut atau kinerja ideal, tidak juga melakukan hal lain.
Pernyataan bahwa kita tidak perlu SQL lagi karena kita sekarang memiliki SSD hanya bermata-mata. SQL tidak ditemukan karena hard drive berkecepatan tinggi belum ada; itu diciptakan karena kami membutuhkan cara standar industri untuk mengekspresikan konsep pengambilan data. Sistem basis data relasional memiliki banyak kualitas lain selain kecepatan dan keamanan yang menjadikannya ideal untuk operasi bisnis; khususnya, ACID . Integritas data setidaknya sama pentingnya dengan kecepatan atau keamanan, dan jika Anda tidak memilikinya, lalu apa gunanya mengamankan data yang buruk atau mengambilnya secepat mungkin?
Sebelum Anda mengambil histeria satu orang sebagai Injil, saya sarankan Anda belajar tentang keamanan aplikasi dan sistem dan kinerja dengan persyaratan mereka sendiri, bukan dengan membaca artikel Internet acak. Ada banyak hal lain untuk keamanan, kinerja, dan desain sistem yang tangguh daripada sekadar "hindari teknologi ini."
Kami tidak melarang pisau dapur karena beberapa orang yang malang berhasil memotong jari mereka secara tidak sengaja.
sumber
Apa yang sebenarnya dia katakan?
TL; DR: Ya (semacam)
Dalam sebuah pembicaraan yang lebih baru daripada yang Anda tautkan pada dasarnya pada topik yang sama ia berkata: "Database adalah detail. Mengapa kita memiliki database?" .
Dia mengklaim basis data datang untuk membuat akses data dari disk pemintalan lebih mudah, tetapi di masa depan "[...] tidak akan ada disk" berkat teknologi baru dan apa yang disebutnya "RAM persisten" dan akan lebih mudah untuk menyimpan data menggunakan struktur yang digunakan programmer, seperti hashtable atau tree.
Dia melanjutkan untuk memprediksi bahwa basis data relasional secara keseluruhan sebagian besar akan hilang karena kompetisi baru mereka:
Jadi tidak, baginya itu bukan hanya tentang injeksi SQL, meskipun ia berpendapat SQL secara inheren cacat dalam hal ini .
Catatan penulis:
Pernyataan dalam posting ini hanya kutipan untuk memahami pandangan Robert C. Martin tentang topik ini dan tidak mewakili pendapat penulis. Untuk sudut pandang yang lebih berbeda, lihat jawaban Robert Harvey .
sumber
SQL adalah detail. Pengetahuan detail tidak harus disebarkan.
Karena SQL digunakan di semakin banyak tempat dalam kode Anda, kode Anda menjadi semakin tergantung padanya.
Saat Anda mempelajari semakin banyak trik SQL, Anda memecahkan semakin banyak masalah menggunakan SQL. Ini berarti bahwa beralih ke API lain untuk bertahan melibatkan lebih dari sekadar menerjemahkan. Anda harus menyelesaikan masalah yang tidak Anda sadari.
Anda mengalami ini bahkan beralih antara Database. Satu menawarkan fitur mewah whizzbang 5 sehingga Anda menggunakannya di sejumlah tempat hanya untuk mengetahui fitur mewah whizzbang 5 adalah milik dan sekarang Anda memiliki masalah lisensi yang akan menghabiskan banyak uang. Jadi Anda melakukan banyak pekerjaan menggali di mana-mana Anda menggunakan fitur 5 dan menyelesaikan masalah sendiri hanya untuk mencari tahu nanti Anda juga menggunakan fitur whizzbang 3.
Salah satu hal yang membuat Java begitu portabel adalah fitur-fitur tertentu dari CPU tidak tersedia. Jika tersedia, saya akan menggunakannya. Dan tiba-tiba ada CPU yang kode Java saya tidak akan berfungsi karena mereka tidak memiliki fitur-fitur itu. Ini sama dengan fitur basis data.
Mudah mengorbankan kemerdekaan Anda tanpa menyadarinya. SQL adalah pilihan bukan yang diberikan. Jika Anda membuat keputusan untuk menggunakan SQL maka buatlah di satu tempat. Buatlah dengan cara yang bisa dibuat-buat.
Fakta bahwa SQL memiliki masalah keamanan dan bahwa kita akan beralih ke model memori yang persisten tidak berarti SQL akan hancur. Ini hanya mengarahkan titik bahwa itu pilihan. Jika Anda ingin mempertahankan hak untuk membuat pilihan itu, Anda harus melakukan pekerjaan itu.
Mungkin perlu dicatat bahwa pergerakan basis data tahun 80-an dan Paman Bob memiliki sejarah yang agak buruk. Dia memiliki semua masalahnya diselesaikan dengan sistem file datar ketika manajemen memaksa admin database ke dalam hidupnya. Acara ini mendorongnya ke dalam karir konsultan bintangnya. (Dia menceritakan kisah ini di salah satu buku awalnya yang bersih, lupakan yang mana). Dia tahu bagaimana menyelesaikan masalah tanpa DB dan memiliki sedikit kesabaran untuk mereka yang bertindak seperti menggunakannya adalah sesuatu yang diberikan.
Dia juga bercerita tentang menunda menambahkan DB ke aplikasi sampai menit terakhir ketika pelanggan menuntutnya, dan menambahkannya dalam sehari sebagai fitur opsional. Dugaan saya adalah dia melihat cara sebagian besar dari kita menggunakan DB sebagai kecanduan. Dia berusaha menunjukkan kepada kita bagaimana menghentikan kebiasaan itu.
sumber
Kutipan dari kutipan pertama Anda adalah (penekanan milikku),
Kata-kata kasar menentang membiarkan programmer aplikasi menggunakan SQL.
Perbaikan yang disarankan adalah membiarkan mereka menggunakan API sebagai gantinya: yang bukan SQL dan tidak mengizinkan injeksi.
IMO, contoh-contoh API tersebut mungkin termasuk:
http://bobby-tables.com/csharp menyarankan pemrogram C # dapat menggunakan API ADO.NET.
Itu bukan contoh sempurna karena ADO.NET adalah API yang luas atau dalam (yaitu kuat atau untuk tujuan umum), yang juga memungkinkan penggunanya untuk memasukkan SQL mentah (atau mentah-ish).
Beberapa pengembang SQL atau administrator database menyarankan bahwa database harus dikonfigurasikan sedemikian rupa sehingga hanya mengizinkan akses melalui sejumlah prosedur yang tersimpan , dan pengembang aplikasi seharusnya tidak diizinkan untuk menulis kueri SQL mereka sendiri (berbahaya)
Cara lain untuk "menghilangkan SQL dari sistem" adalah dengan meletakkan database (yang memaparkan SQL) pada beberapa sistem lain , diakses melalui REST API atau yang serupa.
Jadi, IMO, solusi keseluruhan atau sistem [s] masih dapat menggunakan database (terutama mengingat bahwa mesin database mengimplementasikan properti ACID yang berguna, dan skala dengan baik dan seterusnya, mungkin bodoh untuk mencoba melakukannya tanpa satu, atau menulis satu aplikasi khusus).
Persyaratan kata-kata kasar terpenuhi jika SQL API database disembunyikan dari pengembang aplikasi, di belakang beberapa API lainnya (misalnya ADO, mungkin ORM, layanan Web, atau apa pun).
Lebih umum saya kira itu berarti memiliki DAL khusus aplikasi ("lapisan akses data" atau "lapisan abstraksi basis data"). DAL mengisolasi aplikasi dari perincian tentang bagaimana dan di mana data disimpan dan / atau diambil. DAL mungkin atau mungkin tidak diimplementasikan menggunakan database SQL.
sumber
Semua orang tampaknya menjawab pertanyaan ini dari sudut pandang keamanan, atau dengan lensa SQL.
Saya melihat ceramah Robert Martin di mana dia menceritakan bahwa sebagai programmer, kami menggunakan banyak struktur data berbeda yang optimal untuk program khusus kami. Jadi, daripada secara universal menyimpan semua data dalam struktur tabel, kita harus menyimpan data kita dalam tabel hash, pohon, dll sehingga kita dapat mengambil data dan langsung masuk ke program.
Saya menafsirkan pesannya sebagai hanya mengatakan kita harus membuang asumsi kita saat ini tentang penyimpanan persisten sejenak untuk mempertimbangkan kemungkinan lain di masa depan daripada format tabular SQL kuno. SSD adalah solusi kandidat, tetapi bukan satu-satunya.
sumber
Sebenarnya, dia tidak menggunakan database dan SQL - cukup eksplisit. Referensi pertama adalah masalah yang diketahui dengan baik, referensi kedua terdengar seperti kata-kata kasar. Meskipun, saya menafsirkannya sebagai alasan yang baik untuk menggunakan database dan tidak menggunakan SQL. Dari sudut pandang saya, ini bahkan bukan saran yang masuk akal.
Sayangnya, contoh yang ia gunakan adalah contoh yang sangat dikenal dengan solusi terkenal yang kemudian ia tunjukkan. Biasanya muncul ketika seorang programmer tidak menyadari apa yang dia lakukan. Misalnya membangun string yang berisi SQL seperti:
sebagai lawan
Ini adalah perl DBI seperti contoh untuk ruby on rails code. Kode rel yang ia sediakan mudah membingungkan antara brankas dan tidak aman. Seperti banyak ORM menyembunyikan apa yang ada di bawah SQL dan sering kali Anda berurusan dengan antarmuka yang membangun dan mengeksekusi sql untuk Anda. Bukankah ini terdengar seperti apa yang akan dilakukan API untuk Anda?
Interpretasi saya tentang referensi pertama adalah bahwa ia menyarankan agar kita mengganti masalah yang sudah diketahui dan memiliki solusi yang sudah diketahui.
Sangat disayangkan bahwa dia tidak menyebutkan bahwa jika ini dilakukan dengan benar, itu akan membuat kode lebih mudah untuk ditulis dan lebih mudah dibaca, meskipun jika dilakukan dengan baik, itu sebenarnya mungkin lebih sulit untuk ditulis dan kurang dapat dibaca. Selain itu, ia tidak menyebutkan bahwa SQL sangat mudah dibaca dan melakukan apa yang biasanya Anda harapkan.
Dia sebagian benar, pada akhirnya kita akan memiliki memori yang sangat besar dan cepat dan prosesor yang sangat cepat. Sampai kita keluar dari fisika saat ini yang membatasi komputasi, dia tidak benar.
Ya spinning disk adalah sesuatu dari masa lalu, dan kami sekarang menggunakan SSD. Disk bekerja dengan ~ 10 milidetik per transfer data, SSD bekerja dengan ~ 0,5 milidetik (500 mikrodetik) waktu akses data. RAM ada di urutan 100 nano detik, prosesor beroperasi di atas 100 detik pico. Inilah jantung mengapa kita membutuhkan basis data. Database mengelola transfer data antara disk pemintalan atau SSD dengan memori utama. Munculnya SSD belum menghilangkan kebutuhan akan database.
sumber
Menjawab
Artikel 'Bobby Tables' tampaknya menyarankan bahwa ini, dan dengan sendirinya adalah alasan untuk tidak menggunakan SQL:
Dia mungkin punya alasan lain yang dia diskusikan di tempat lain. Saya tidak akan tahu karena saya tidak benar-benar membaca banyak hal tentangnya.
Penyimpangan
Bagian ini sebenarnya bukan jawaban, tapi saya pikir pertanyaan tentang nilai SQL jauh lebih menarik (seperti yang dilakukan orang lain, tampaknya.)
Saya sudah memiliki banyak pengalaman menggunakan SQL dan saya pikir saya memiliki pemahaman yang adil tentang kekuatan dan kelemahannya. Perasaan pribadi saya adalah bahwa itu sudah digunakan secara berlebihan dan dilecehkan, tetapi gagasan bahwa kita seharusnya tidak pernah menggunakannya agak konyol. Gagasan bahwa kita harus memilih 'SQL always' atau 'SQL never' adalah dikotomi yang salah.
Sejauh injeksi SQL menjadi argumen untuk tidak menggunakan SQL, itu menggelikan. Ini adalah masalah yang dipahami dengan baik dengan solusi yang cukup sederhana. Masalah dengan argumen ini adalah bahwa SQLi bukan satu-satunya kerentanan yang ada. Jika Anda berpikir bahwa menggunakan API JSON membuat Anda aman, Anda akan terkejut.
Saya pikir setiap pengembang harus menonton video ini berjudul "Friday the 13th: Menyerang JSON - Alvaro Muñoz & Oleksandr Mirosh - AppSecUSA 2017"
Jika Anda tidak memiliki waktu atau kecenderungan untuk melihatnya, inilah intinya: Banyak perpustakaan deserialisasi JSON memiliki kerentanan eksekusi kode jauh. Jika Anda menggunakan XML, Anda harus lebih khawatir. Melarang SQL dari arsitektur Anda tidak akan membuat sistem Anda aman.
sumber
Saya hanya ingin membahas pernyataan singkat:
Tidak. Itu anggapan yang salah. Kita tidak bisa mengatakan kita harus berhenti menggunakan mobil, karena mereka bertanggung jawab atas orang yang meninggal dalam kecelakaan mobil. Dengan cara yang sama, database SQL / relasional (atau apa pun dalam konteks ini, seperti RDBMS) tidak bertanggung jawab atas muatan SQL berbahaya yang dapat dilakukan oleh penyerang di aplikasi web Anda. Saya yakin penulis tidak bermaksud demikian, karena ada lembar contekan pencegahan injeksi SQL untuk tujuan ini.
sumber
Masalah Martin tampaknya dengan programmer membangun SQL dinamis langsung dari input pengguna, seperti (maafkan saya, saya terutama seorang programmer C dan C ++):
yang benar - benar resep untuk mulas (maka strip Bobby Tables ). Setiap pemrogram yang menempatkan kode seperti itu dalam sistem produksi berhak mendapatkan paddlin '.
Anda dapat mengurangi (jika tidak sepenuhnya menghilangkan) masalah dengan menggunakan pernyataan yang disiapkan dan membersihkan input Anda dengan benar. Jika Anda dapat menyembunyikan SQL di belakang API sedemikian rupa sehingga programmer tidak secara langsung membuat string kueri, jauh lebih baik (yang merupakan bagian dari apa yang disarankan Martin).
Tetapi untuk menghilangkan SQL sepenuhnya, saya tidak berpikir itu praktis atau diinginkan. Model relasional bermanfaat , itu sebabnya mereka ada di tempat pertama, dan SQL mungkin merupakan antarmuka terbaik untuk bekerja dengan model relasional.
Seperti biasa, ini masalah menggunakan alat yang tepat untuk pekerjaan itu. Jika aplikasi keranjang belanja Anda tidak memerlukan model relasional penuh, maka jangan gunakan model relasional (artinya Anda tidak perlu menggunakan SQL). Untuk saat-saat Anda membutuhkan model relasional, maka Anda hampir pasti akan bekerja dengan SQL.
sumber
sprintf
tidak mengandung jenis sanitasi yang diperlukan SQL, fungsi-fungsi yang dirancang khusus untuk tujuan ini dilakukan, dan sangat aman. Contoh: SqlQuery dalam Entity Framework .sprintf
-ing SQL dinamis, yang Bukan Bagaimana Anda Melakukannya.Dua sumber yang Anda tautkan menyampaikan pesan yang berbeda:
Posting blog mengatakan bahwa logika akses data tidak boleh ada sebagai teks saat runtime, jangan sampai dicampur dengan input pengguna yang tidak terpercaya. Artinya, posting blog mengutuk menulis pertanyaan dengan merangkai string.
Ceramahnya berbeda. Perbedaan pertama adalah dalam nada: Kuliah berspekulasi dan menimbulkan pertanyaan, tetapi tidak mengutuk. Dia tidak mengatakan bahwa database itu jahat, tetapi menantang kita untuk membayangkan kegigihan tanpa database. Dia berpendapat bahwa dalam 30 tahun sejak database relasional menjadi luas banyak hal telah berubah, dan menyoroti dua yang mungkin memengaruhi pilihan teknologi ketekunan kami:
Apakah keadaan yang berubah ini mengubah teknologi ketekunan yang optimal? Menariknya, Paman Bob tidak mengatakan - mungkin karena dia merasa tidak ada jawaban yang benar untuk semua program. Itulah sebabnya dia memperingatkan kita untuk memperlakukan pilihan teknologi kegigihan kita sebagai detail daripada mengabadikannya menjadi loh batu dan meneruskannya sebagai hikmat yang diterima kepada rekan-rekan kita.
Apakah ada alternatif?
Menulis logika akses data tanpa string sepenuhnya dimungkinkan. Di tanah Jawa, Anda mungkin menggunakan QueryDSL , di mana kueri dideskripsikan menggunakan API fasih-jenis yang dihasilkan dari skema database Anda. Kueri seperti itu mungkin terlihat sebagai berikut:
Seperti yang Anda lihat, logika kueri tidak dinyatakan sebagai String, yang dengan jelas memisahkan struktur tepercaya dari kueri dari parameter yang tidak terpercaya (dan tentu saja, QueryDSL tidak pernah menyertakan parameter ke dalam teks kueri, tetapi menggunakan pernyataan yang disiapkan untuk memisahkan kueri untuk parameternya di tingkat JDBC). Untuk mencapai injeksi SQL dengan QueryDSL, Anda harus menulis parser Anda sendiri untuk mengurai string dan menerjemahkannya ke pohon sintaks, dan bahkan jika Anda melakukannya, Anda mungkin tidak akan menambahkan dukungan untuk hal-hal buruk seperti
select ... into file
. Singkatnya, QueryDSL membuat injeksi SQL tidak mungkin dilakukan, dan juga meningkatkan produktivitas programmer dan meningkatkan keamanan refactoring. Mencegah risiko terbesar terhadap keamanan aplikasi web, yang telah ada cukup lama untuk memunculkan lelucon, dan mendorong produktivitas pengembang? Saya berani mengatakan bahwa jika Anda masih menulis kueri sebagai string, Anda salah melakukannya.Adapun alternatif untuk basis data relasional, sangat penasaran untuk mengetahui bahwa kontrol multi-versi postgres 'postgres' adalah struktur data yang hanya ditambahkan oleh Paman Bob, meskipun ia mungkin lebih memikirkan toko acara , dan sumber acara pola secara umum, yang juga cocok dengan gagasan menjaga kondisi saat ini di RAM.
sumber