Selama beberapa tahun terakhir, tren untuk aplikasi sisi-klien (browser) telah benar-benar hilang.
Untuk proyek terbaru saya, saya telah memutuskan untuk mencoba dan bergerak dengan waktu dan menulis aplikasi sisi klien.
Bagian dari aplikasi ini melibatkan pengiriman email transaksi kepada pengguna (misalnya, validasi pendaftaran, email atur ulang kata sandi, dll.). Saya menggunakan API pihak ketiga untuk mengirim email.
Biasanya saya akan menjalankan aplikasi di server. Saya akan memanggil API pihak ketiga dari kode di server saya.
Menjalankan aplikasi sisi klien berarti ini sekarang harus terjadi pada browser pengguna. API pihak ketiga menyediakan file JavaScript yang diperlukan untuk mencapai hal ini.
Masalah mencolok pertama yang bisa saya lihat adalah saya harus menggunakan kunci API. Ini biasanya disimpan dengan aman di server saya, tetapi sekarang mungkin saya perlu memberikan kunci ini ke browser klien.
Dengan asumsi saya bisa mengatasi masalah ini, masalah berikutnya adalah apa yang menghentikan pengguna yang mengerti teknologi memuat alat pengembang JavaScript di browser dan tetap menggunakan API email yang mereka suka, daripada mengatakan mematuhi aturan yang telah saya tetapkan dalam aplikasi .
Saya kira pertanyaan umum saya adalah - bagaimana kita bisa mencegah penggunaan berbahaya aplikasi sisi klien?
sumber
Jawaban:
Anda tidak bisa, dan semakin banyak orang memahami hal ini, dan semakin dalam mereka memahami, semakin baik bagi dunia.
Kode yang berjalan pada perangkat di bawah kendali pengguna tidak dapat dikontrol. Ponsel cerdas dapat di-jailbreak. Kotak set-top dapat dipecahkan. Peramban biasa bahkan tidak berupaya mencegah akses ke kode JavaScript. Jika Anda memiliki sesuatu yang layak dicuri atau disalahgunakan, penyerang yang gigih akan dapat melakukannya kecuali Anda memvalidasi semua yang Anda hargai dari sisi server.
Kebingungan sangat sedikit membantu; jenis lawan yang akan Anda tarik segera setelah apa pun yang melibatkan keuangan jarak jauh membaca bahasa majelis seperti iklan baris. Enkripsi tidak dapat membantu Anda, karena perangkat yang akan menjaga kunci adalah perangkat yang sama dengan yang Anda anggap sudah retak. Ada banyak tindakan pencegahan lain yang tampaknya tidak berhasil, karena alasan yang sama.
Sayangnya, ini adalah kebenaran yang sangat tidak nyaman. Dunia ini penuh dengan operator kecil dan besar yang berpikir bahwa mereka dapat mengatasi kehancuran mendasar dari kepercayaan jarak jauh, hanya karena akan sangat bagus jika kita dapat berasumsi bahwa kode kita akan dijalankan seperti yang kita asumsikan. Dan ya, itu akan membuat segalanya jauh lebih mudah sehingga itu bahkan tidak lucu. Tetapi berharap tidak membuatnya demikian, dan berharap melawan harapan bahwa Anda adalah satu-satunya kue cerdas yang dapat menghindari ketidaknyamanan hanya akan membakar Anda dan klien Anda. Karena itu, masuklah ke dalam pola pikir bahwa Internet adalah wilayah musuh, sertakan biaya tambahan itu dalam perkiraan Anda, dan Anda akan baik-baik saja.
Yang mengatakan, tentu saja ada yang namanya pertahanan secara mendalam. Mengacaukan JavaScript Anda tidak menunda penyerang yang ditentukan, tetapi mungkin menunda beberapa penyerang yang kurang bertekad. Jika aset Anda cukup layak untuk dilindungi, tetapi tidak dengan biaya apa pun, tindakan apa pun itu dapat menambah nilai bisnis ke sistem Anda; itu tidak mungkin sempurna. Selama Anda sepenuhnya menyadari trade-off yang Anda buat, itu mungkin strategi yang masuk akal.
sumber
Aturannya di sini adalah:
Lakukan segala sisi klien yang tidak memengaruhi orang lain jika pengguna merusaknya. Secara khusus, itu berarti efek grafis.
Lakukan semua sisi server yang perlu aman, dan cukup kirim acara UI dari klien (mis. Klien hanya mengatakan "pengguna mengetuk tombol Beli" sementara server benar-benar melakukan transaksi). Secara khusus, itu berarti transaksi keuangan.
sumber
Inilah yang membuat aplikasi sisi klien sepenuhnya tidak tepat.
Anda dapat membuat logika dan validasi dasar formulir sisi-klien (Anda masih harus memvalidasi ulang di server, karena seseorang dapat mencoba memalsukan permintaan) untuk meningkatkan daya tanggap, Anda dapat melakukan permintaan HTTP dari JavaScript dengan mengirimkan data di sana dan kembali di JSON ke menghindari pengiriman ulang dekorasi halaman dan semacamnya, tetapi jika transaksi itu sendiri perlu diautentikasi dan diotorisasi, itu harus tetap terjadi di server.
sumber
Paragraf tengah Anda adalah inti masalahnya:
Mengapa aplikasi sisi klien berarti Anda tidak dapat memiliki sisi server yang berfungsi? Dorongan terhadap pemrograman sisi klien bukan tentang menghilangkan server, tetapi meningkatkan teknologi yang lebih baru yang akhirnya didukung browser untuk membuat antarmuka pengguna yang lebih baik.
Sedangkan untuk
.js
file yang Anda terima, apakah Anda yakin itu dimaksudkan untuk browser? Mungkinkah itu perpustakaan node.js?sumber
Mari kita mundur dari sini dan melihat ke tingkat yang lebih tinggi .. akankah kita .. Apakah Eudora atau pandangan (aplikasi sisi klien, bahkan tidak memerlukan browser) pernah menyebabkan kerugian finansial bagi perusahaan mana pun? Tidak. Siapa pun dapat menulis ke API POP / SMTP dan menjadi klien. Tapi tidak ada kerugian ke server. Server tidak membatasi tindakan klien, perhitungan, penyimpanan, suhu, ukuran disk, ukuran ram, monitor DPI, GPU, FPU, dan yada klien, tetapi dengan tepat menentukan apa yang akan dijawab dan tidak lebih. Apakah Anda pernah mendengar tentang MS-Money yang digunakan untuk masuk ke bank?
Aplikasi browser Anda (yaitu sisi klien) dapat menggunakan arsitektur yang sama.
@KilianFoth memunculkan titik kesadaran penting bagi orang yang naif dan ceroboh, terutama mereka yang membaca berita utama sepanjang waktu tetapi tidak pernah berpikir itu akan terjadi pada aplikasi mereka, kode mereka, majikan mereka, klien mereka, rekening bank mereka sendiri. Yang lebih gegabah adalah majikan mereka (terutama CTO) yang akan memungkinkan aplikasi untuk keluar yang mengekspos sistem apa pun untuk eksposur yang tidak terkelola / tidak terkendali. Namun saya selalu bingung bagaimana tampaknya "kita tidak pernah belajar".
Jadi untuk meringkas. Buat API sisi server yang solid dan kencang. Turunkan segala sesuatu yang lain ke klien berdasarkan apa pun yang dapat ditangani klien.
sumber
Saya berpendapat bahwa Anda benar-benar tidak bisa. Jika Anda ingin mengirim data ke klien, Anda harus berharap bahwa itu akan disalahgunakan - namun mungkin. Contoh Anda mengenai kunci API adalah ilustrasi dari poin tersebut, dan saya tidak akan memasukkannya di sisi klien Anda JS - itu akan dicuri dan disalahgunakan.
Anda pasti masih membutuhkan sejumlah kode server untuk menjaga keamanannya. Bahkan sesuatu yang sederhana seperti mengambil hanya data yang terkait dengan pengguna yang masuk. Otentikasi itu tidak dapat dilakukan semua sisi klien atau lagi Anda akan dimanfaatkan dan data Anda tidak aman.
Saya akan selalu melihat pengalaman sisi klien JS sebagai tambahan untuk kode server. Validasi pada klien memberikan pengalaman pengguna yang menyenangkan, tetapi jika Anda tidak memverifikasi bahwa data POST di server penerima juga, Anda membuka diri untuk menyerang. Apa pun dari klien harus dianggap tersangka.
sumber
Cukup sederhana, sungguh. Asumsikan bahwa komputer klien dan semua perangkat lunak yang menjalankannya di bawah kendali penuh peretas jahat yang pandai.
Itu berarti bahwa setiap informasi yang Anda kirim dari server ke klien akan diketahui oleh peretas jahat, jadi Anda harus memastikan untuk tidak mengirimkan informasi kepada klien yang dapat digunakan untuk menyerang server Anda atau bisnis Anda.
Ini juga berarti bahwa apa pun yang dikirim dari klien ke server telah dihasilkan oleh peretas jahat, jadi kode server Anda harus memastikan bahwa tidak ada yang dapat dikirim oleh klien yang dapat berhasil menyerang server Anda.
Memang, implementasi adalah masalah, tetapi yang penting adalah sikap mental, asumsi bahwa "klien" yang Anda pikir server Anda ajak bicara bukanlah klien tetapi penyerang aktif.
(Anda juga harus menganggap bahwa pengguna adalah penipu pintar yang akan mencoba menyerang metode bisnis Anda, tetapi itu tidak ada hubungannya dengan pemrograman sisi klien).
sumber
Aplikasi Sisi Klien, menurut saya, sebagian besar tentang UI. Misalnya, semua sistem UI Anda akan dikirim satu kali ke klien, dan kemudian klien akan melakukan apa pun yang diinginkannya.
Jika Anda memiliki Kunci API, maka itu tidak dimaksudkan untuk bekerja di sisi klien. Jika Anda memberikan Kunci API di sisi klien, maka siapa pun dapat mengaksesnya, dan kemudian dapat menggunakannya untuk tujuan itu sendiri. Simpan dan gunakan sisi server ketika klien membutuhkannya, lalu kirim hasilnya menggunakan Ajax / WebSockets.
Ini seperti jika bank Anda mengatakan: "Yah, saya akan meletakkan kata sandi dari sisi klien basis data utama sehingga klien dapat memintanya sendiri dan dia tidak akan mengganggu server kami lagi."
sumber