Mengapa perlindungan terhadap injeksi SQL bukan prioritas utama?

39

Pada Stack Overflow, saya melihat banyak kode PHP dalam pertanyaan dan jawaban yang memiliki pertanyaan MySQL yang sangat rentan terhadap serangan injeksi SQL, meskipun solusi dasar tersedia secara luas selama lebih dari satu dekade.

Apakah ada alasan mengapa jenis potongan kode ini masih digunakan saat ini?

Lightness Races with Monica
sumber
37
menyalahkan tutorial online yang ditulis dengan buruk. lebih sering daripada tidak, orang hanya menyalin dan menempelkan kode apa pun yang mereka temukan di internet. JavaScript juga merupakan korban dari praktik semacam itu.
KJYe. Nama
34
Salahkan blog. Oh, dan W3Schools ...
Brian Driscoll
13
Ya, benar-benar W3Schools - lihat w3fools.com
DisgruntledGoat
2
Saya selalu melihat orang-orang memperingatkan tentang injeksi sql - jadi saya bahkan tidak berpikir bahwa premis dari pertanyaan ini valid. Ini adalah prioritas tinggi.
GrandmasterB
3
Apa yang saya lihat dalam banyak jawaban adalah bahwa lebih mudah untuk mengajarkan PHP yang rusak daripada mengajar, well, PHP yang tidak rusak secara kritis. Anda tidak dapat menerima argumen itu dan masih mengklaim bahwa PHP bukan bahasa yang buruk
user16764

Jawaban:

34

Saya pikir itu sebagian besar karena a) ketidaktahuan b) kemalasan. Pemula biasanya tidak tahu banyak tentang injeksi sql, dan bahkan ketika mereka mendengarnya, mereka mengabaikannya karena itu jauh lebih sederhana dan lebih mudah untuk kode seperti itu.

froadie
sumber
8
Saya sudah mencoba untuk memperbaiki hal-hal seperti itu di tempat lain, hanya untuk diberitahu bahwa itu tidak relevan untuk masalah yang dihadapi. Jadi karena banyak orang lebih suka peretasan sederhana daripada solusi bagus yang sedikit lebih rumit, contoh buruk dibiarkan sendiri.
l0b0
6
Kebanyakan orang tidak terlalu peduli dengan injeksi SQL sampai mereka terkena dampaknya. Lalu tiba-tiba mereka bertanya-tanya ke mana meja mereka pergi.
Joel Etherton
1
Alasan lainnya adalah injeksi SQL tidak selalu dipandang sebagai masalah yang relevan untuk aplikasi internal. (Bukannya itu benar.)
John Fisher
1
Jangan lupa bahwa Jawaban ada untuk menjawab pertanyaan. Seringkali itu adalah pseudo-code (atau SQL) yang dimaksudkan untuk menjawab pertanyaan, tidak serta merta menyediakan solusi salin dan tempel yang aman dan aman (terlepas dari bagaimana jawaban tersebut dapat digunakan dalam kenyataan).
Dalin Seivewright
1
@ l0b0 Saya tahu seseorang yang membuat orang untuk mengambil perbaikan injeksi SQL dengan serius dengan benar-benar menunjukkan serangan injeksi SQL terhadap kode produksi saat ini.
user16764
26

PHP sengaja membuatnya sangat, sangat mudah bagi orang yang tahu sedikit untuk membuat halaman web dinamis yang bermanfaat. Ini berarti bahwa PHP akan menarik banyak pemula, yang menciptakan sesuatu yang bermanfaat, belajar dari contoh-contoh lain yang bermanfaat, dan berbalik untuk mengajar orang lain bagaimana melakukan hal yang keren dan bermanfaat ini. Hasilnya adalah banyak kode buruk, dan pasokan programmer yang tidak tahu yang lebih baik.

Itu hanya membuat segalanya lebih buruk bahwa sebagian besar programmer yang kompeten tidak ingin melakukan apa pun dengan PHP. Ini mengurangi basis orang yang berpengalaman yang mau mengajar orang lain dengan lebih baik. Tetapi mengapa mereka menghindari PHP? Baik untuk kombinasi faktor. Sebagian mereka tidak suka berurusan dengan kutil bahasa. Dan sebagian karena mereka lebih suka bekerja dengan kode yang baik, dan tidak ada banyak PHP yang bagus di luar sana.

Konstelasi masalah yang tepat ini digunakan untuk menimbulkan Perl. Sebagai contoh yang cemerlang, perhatikan kasus Matt Wright, seorang remaja yang antusias yang ingin menyediakan banyak skrip CGI yang bermanfaat, terdokumentasi dengan baik, dan mudah dipasang pada 1990-an. Sayangnya dia tidak mengerti apa-apa tentang keamanan, dan juga orang-orang yang ingin menggunakan barang-barangnya. Hasilnya adalah Arsip Arsip Matt Wright, yang merupakan aliran masalah keamanan tanpa akhir untuk skrip CGI awal. Meskipun ada upaya seperti http://www.scriptarchive.com/nms.html , masalahnya tidak membaik untuk Perl sampai penyedia hosting berbagi membuat PHP lebih nyaman daripada yang lainnya. Itu menyebabkan masalah pindah dari Perl ke PHP.

btilly
sumber
Seperti yang Anda katakan, masalahnya bukan perl atau PHP, itu bahasa yang memungkinkan pemula melakukan banyak hal, yang baik, tetapi tidak selalu memberikan cara untuk melakukannya dengan baik yang jelas.
Zachary K
2
@ ZacharyK: Bukankah itu kesalahan bahasa secara default?
Lightness Races dengan Monica
6
@ tomalak-geretkal: Anda menggunakan kata "kesalahan" seolah-olah memungkinkan untuk menyelesaikan sesuatu adalah hal yang buruk. Karakteristik yang sama yang menyebabkan banyak kode buruk juga menyebabkan banyak masalah nyata diselesaikan. Tidak jelas apakah ini merupakan hal buruk secara keseluruhan.
btilly
Re 'fault': jika HTML (atau lebih tepatnya browser yang menafsirkannya) toleran terhadap kesalahan seperti XSL, tidak akan pernah ada web di seluruh dunia ...
Benjol
8

Sayangnya ada ton dari lebih dari yang buruk tutorial PHP di luar sana dan beberapa buku PHP yang lebih tua juga mengisap memberitahu orang-orang untuk menulis kode yang tepat (tidak menggunakan register_globals dll).

Selain itu, dengan magic_quotes_gpcdiaktifkan di masa lalu, orang tidak peduli untuk melarikan diri karena "itu hanya berhasil".

Pencuri
sumber
4

Secara pribadi, saya percaya PHP mudah digunakan, jadi tentu saja itu mudah disalahgunakan.

davidhaskins
sumber
2

Sebagai manusia, dan seorang programmer, saya merasa sangat mudah untuk melakukan kesalahan, dan mengabaikan hal-hal tertentu, terutama ketika terdesak waktu.

Mudah, dan mungkin terlalu menggoda, untuk menyalahkan bahasa tertentu, karena terlalu mudah diakses untuk kebaikannya sendiri. Tapi itu akan menutupi masalah yang lebih besar dari falibilitas manusia, terlepas dari bahasa yang dipilih untuk diprogramkan.

Memang, kita sudah jauh sejak bahasa assembly, dan saya pikir saya akan jauh lebih produktif pemrograman dalam bahasa yang lebih modern, seperti PHP, Python, Ruby, atau Java.

PHP (dan bahasa skrip lain) sebenarnya telah menurunkan penghalang untuk masuk. Itu mungkin berarti bahwa lebih banyak pendatang baru dalam pemrograman mencoba PHP terlebih dahulu. Tapi itu tentu saja tidak juga berarti bahwa semua programmer PHP entah bagaimana kurang berkualitas, atau kurang mampu belajar dari kesalahan mereka daripada programmer dari bahasa lain.

Rasmus Lerdorf menciptakan PHP dalam bentuk aslinya pada tahun 1994, telah berevolusi sejak saat itu. Dalam inkarnasinya yang paling modern, ia mendukung pemrograman berorientasi objek, serta kerangka kerja yang luar biasa, seperti Symfony. PHP sebagai bahasa telah terbebas dari kendala aslinya, dan telah berkembang untuk menawarkan fleksibilitas besar dalam bagaimana pemrogram dapat memilih untuk menggunakannya. Anda dapat menggunakannya untuk membuat skrip 9.000 kode spaghetti, atau Anda dapat menggunakannya dalam konteks kerangka MVC modern, seperti Symfony: itu pilihan Anda!

Saya sangat curiga bahwa kerentanan keamanan tidak terbatas pada satu bahasa saja. Sangat menggoda untuk menghapus semua pemrogram PHP yang entah bagaimana kurang mampu, atau lebih rentan untuk menulis kode tidak aman. Tetapi saya bertanya-tanya berapa banyak dari itu bias bahasa, dan seberapa banyak itu fakta?

Jay Sheth
sumber
Saya tidak mengatakan apa-apa tentang "semua programmer PHP".
Lightness Races with Monica
2

Saya pikir bagian dari masalahnya adalah orang-orang yang hanya menyalin kode tanpa repot-repot belajar apa yang mereka lakukan, tetapi benar-benar dalam pikiran saya cara kita mengajarkan porgamnming rusak dan itu adalah salah satu alasan mengapa ada begitu banyak kode buruk. Kami mengajarkan sintaks di luar konteks dan para pemula tidak tahu kapan harus menggunakan sesuatu dan kapan tidak atau masalah apa yang ingin diselesaikan oleh sintaks dan masalah apa yang tidak ingin dipecahkan. JADI mereka menggunakan palu ketika kunci pas akan menjadi alat yang lebih baik.

Jadi sebagai contoh alih-alih mengajar hanya sintaks, Anda mengatur kursus seperti (Jelas akan ada lebih banyak langkah, ini hanya contoh dasar membangun dari masalah dasar ke masalah yang lebih kompleks daripada hanya mengajar sintaksis):

  1. Ini adalah cara Anda mengatur halaman web dasar
  2. Ini adalah bagaimana Anda membuat halaman web menarik data dari database
  3. Ini adalah cara Anda mengirim data dari halaman web ke database
  4. Ini adalah bagaimana Anda memastikan data yang benar dikirim.
  5. Ini adalah bagaimana Anda melindungi database Anda dari entri data berbahaya
HLGEM
sumber
itu kurang lebih seperti cara saya diajari php +1
Rémi
1

Saya pikir Anda akan menemukan jumlah contoh MS SQL + ASP / ASP.NET yang sama yang rentan.

Saya merasakan masalah ini sebagian berasal dari kenyataan bahwa ketika Anda mencoba mengajarkan sesuatu, katakanlah memfilter data menggunakan klausa WHERE, maka Anda benar-benar tidak ingin mengacaukan contoh Anda dengan keluar dari string kueri dengan benar atau menggunakan perintah parametris.

Saya telah melatih pengembang selama bertahun-tahun dan saya bisa berempati dengan orang-orang yang menulis kode mengerikan dalam tutorial. Terkadang itulah yang paling mudah dipahami. Namun, di samping saya selalu menunjukkan kode yang rentan dan membuatnya menjadi topik sampingan yang menarik.

Fung
sumber
6
Itu tidak seharusnya samping. Itu harus menjadi bagian dari pelajaran dasar. Mungkin dengan peringatan besar, gemuk, tentang cara yang salah untuk melakukan sesuatu. Orang-orang cenderung memotong dan menempel apa yang pertama kali mereka lihat, dan Anda benar-benar ingin itu menjadi cara yang tepat untuk melakukan sesuatu.
btilly
Tentunya di dunia .NET parameterisasi cukup mudah hari ini dan memang harus menjadi 'halaman satu'.
Alan B
1

Penulis asli PHP, Rasmus Lerdorf , dalam entri blognya yang terkenal menganjurkan pengembangan "tanpa kerangka" . Meskipun untuk query SQL ia menggunakan PDO, jadi tidak ada risiko injeksi SQL. Masih cukup jelek dan usang dibandingkan dengan kerangka kerja MVC modern dengan lapisan ORM.

vartec
sumber
5
Tentunya memungkinkan untuk merekayasa situs secara berlebihan dengan kerangka kerja kompleks yang tidak Anda perlukan. Saya akan mengatakan bahwa saran Rasmus mendekati bahaya kriminal, tapi jelas ada jalan tengah yang waras.
Lightness Races dengan Monica
saat ini menggunakan ORM bukanlah rekayasa berlebihan; itu standar. Begitu juga dengan pola MVC.
vartec
3
@vartec: Ini tidak "standar" hanya karena semua domba menggunakannya (dan, untuk apa itu layak, bahkan tidak semua domba yang menggunakannya). Untuk skrip kecil dapat dengan mudah dilakukan rekayasa berlebihan.
Lightness Races dengan Monica
1
@ Tomalak: standar, karena itulah cara untuk mengimplementasikan proyek yang bersih dan berkelanjutan. "skrip kecil" cenderung tumbuh dari waktu ke waktu dan berubah menjadi monstrositas yang tidak dapat dipertahankan.
vartec
2
@ vartec: Saya pikir Anda telah salah mengerti arti "standar".
Lightness Races dengan Monica
1

Anda bisa menyalahkan praktik buruk ini di PHP itu sendiri. Versi lama PHP (hingga tahun 2006) akan keluar dari semua variabel input GET dan POST sehingga cocok untuk interpolasi kueri basis data OLEH DEFAULT. Lihat http://php.net/manual/en/security.magicquotes.php

Ben XO
sumber
2
Ada saat itu akan melarikan diri SEMUA variabel seolah-olah mereka pergi ke MySQL secara khusus, apakah mereka pernah atau tidak . Catatan untuk perancang bahasa: ketika Anda harus menerapkan stripslashes(), Anda sudah salah melakukannya.
Dan Ray
0

Jangan bingung tujuan tutorial, yaitu untuk menunjukkan sesuatu secara sederhana, dengan apa yang harus dilakukan dalam lingkungan produksi. Sebagai contoh, sebagian besar kode tutorial yang saya tulis memiliki sedikit atau tidak ada pengecekan error / exception. Saya mencoba mengingatkan pembaca bahwa kode itu hanya menunjukkan bagaimana melakukan tugas tertentu, bukan bagaimana mencakup semua hasil yang mungkin.

SnoopDougieDoug
sumber
3
Maaf, tetapi sama sekali tidak ada kode contoh yang harus mencampur permintaan mySQL dengan PHP. Itu hanya salah melakukannya.
Raynos
1
Dan tidak bertanggung jawab.
Lightness Races with Monica
-1 untuk most tutorial code I have written has little or no error/exception checking..
yannis
Saya bisa melihat poin OP. Tidak bertanggung jawab adalah, ketika seorang majikan mempekerjakan seorang pria yang tidak memiliki pengetahuan tentang injeksi SQL dan sejenisnya.
Raffael
Saya pikir pendekatan ini dapat dipertahankan jika Anda memasukkan komentar secara langsung dalam kode yang mengatakan "Jangan gunakan ini dalam produksi!". Dengan begitu copy / paster tidak punya alasan.
Benjol
-1

Ketika saya sedang belajar PHP saya melihat beberapa buku PHP + MySQL ini, dan ya saya merasa itu berkontribusi pada praktik buruk itu. Tetapi saya memiliki simpati, karena mereka mengajar bahasa , bukan praktik pemrograman yang baik. Kalau tidak, di mana itu akan berakhir?

Steve Rathbone
sumber
2
Tetapi ketika Anda mengajar bahasa, Anda masih harus menggunakan API yang disukai dalam contoh Anda. Seperti selalu menggunakan bentuk parametrik dari query SQL, mungkin dengan catatan kaki seperti "Jangan pernah berpikir untuk menggunakan interpolasi untuk membangun SQL. Tampaknya sedikit lebih mudah, tetapi sangat rentan terhadap kerentanan keamanan."
Jan Hudec
Yap, poin bagus. Catatan kaki akan menjadi pengingat yang baik, dan itu berlaku untuk tutorial online juga. Namun, dalam semua keseriusan, alangkah baiknya jika penulis buku dari semua bahasa dapat memasukkan saran dari OWASP ke dalam teks pemula. Bahkan hanya sebagai referensi. Yayasan OWASP melakukan pekerjaan dengan baik.
Steve Rathbone
@ indifferentDrum: Anda juga bisa mengajar orang mengemudi dengan kaki - bukan berarti itu ide yang bagus.
Lightness Races with Monica