Artikel ini adalah yang pertama dari rangkaian postingan yang saya tulis tentang menjalankan berbagai produk dan situs SaaS selama 8 tahun terakhir. Saya akan berbagi beberapa masalah yang telah saya tangani, pelajaran yang saya peroleh, kesalahan yang saya buat, dan mungkin beberapa hal yang berjalan dengan baik. Let me know apa yang Anda pikirkan!
Pada tahun 2019 atau 2020, saya memutuskan untuk menulis ulang seluruh backend Blokir Pengirim, aplikasi SaaS yang membantu pengguna membuat blok email yang lebih baik, di antara fitur-fitur lainnya. Dalam prosesnya, saya menambahkan beberapa fitur baru dan meningkatkan ke teknologi yang lebih modern. Saya menjalankan pengujian, menerapkan kode, menguji secara manual semua yang ada dalam produksi, dan selain beberapa peluang acak, semuanya tampak berfungsi dengan baik. Saya berharap ini adalah akhir dari cerita, tapiโฆ
Beberapa minggu kemudian, saya diberitahu oleh seorang pelanggan (yang tentunya memalukan) bahwa layanan tersebut tidak berfungsi dan mereka menerima banyak email yang seharusnya diblokir di kotak masuk mereka, jadi saya menyelidikinya. Seringkali masalah ini terjadi karena Google menghapus koneksi dari layanan kami ke akun pengguna, yang ditangani sistem dengan memberi tahu pengguna melalui email dan meminta mereka untuk terhubung kembali, namun kali ini masalahnya berbeda.
Sepertinya pekerja backend yang menangani pemeriksaan email terhadap blok pengguna terus mogok setiap 5-10 menit. Bagian yang paling aneh โ tidak ada kesalahan dalam log, memori baik-baik saja, tetapi CPU terkadang melonjak pada waktu yang tampaknya acak. Jadi selama 24 jam berikutnya (dengan istirahat 3 jam untuk tidur โ maaf pelanggan ๐ฌ), saya harus memulai ulang pekerja secara manual setiap kali pekerja mogok. Untuk beberapa alasan, layanan Elastic Beanstalk menunggu terlalu lama untuk dimulai ulang, itulah sebabnya saya harus melakukannya secara manual.
Men-debug masalah dalam produksi selalu menyusahkan, terutama karena saya tidak dapat mereproduksi masalah tersebut secara lokal, apalagi mencari tahu apa penyebabnya. Jadi seperti pengembang โbaikโ lainnya, saya baru saja mulai masuk segala sesuatu dan menunggu server mogok lagi. Karena CPU melonjak secara berkala, menurut saya ini bukan masalah makro (seperti saat Anda kehabisan memori) dan mungkin disebabkan oleh email atau pengguna tertentu. Jadi saya mencoba mempersempitnya:
- Apakah error terjadi pada ID atau jenis email tertentu?
- Apakah crash terjadi pada pelanggan tertentu?
- Apakah itu mogok secara berkala?
Setelah berjam-jam melakukan ini, dan menatap log lebih lama dari yang saya inginkan, akhirnya, saya mempersempitnya ke pelanggan tertentu. Dari sana, ruang pencarian sedikit menyempit โ kemungkinan besar itu adalah aturan pemblokiran atau email tertentu yang terus dicoba ulang oleh server kami. Untungnya bagi saya, masalahnya adalah yang pertama, yang merupakan masalah yang jauh lebih mudah untuk di-debug mengingat kami adalah perusahaan yang sangat berfokus pada privasi dan tidak menyimpan atau melihat data email apa pun.
Sebelum kita masuk ke permasalahan sebenarnya, mari kita bahas dulu salah satu fitur Block Sender. Saat itu saya memiliki banyak pelanggan yang meminta pemblokiran wildcard, yang memungkinkan mereka memblokir jenis alamat email tertentu yang mengikuti pola yang sama. Misalnya, jika Anda ingin memblokir semua email dari alamat email pemasaran, Anda dapat menggunakan wildcard marketing@*
dan itu akan memblokir semua email dari alamat mana pun yang dimulai dengan marketing@
.
Satu hal yang tidak saya pikirkan adalah tidak semua orang memahami cara kerja wildcard. Saya berasumsi bahwa kebanyakan orang akan menggunakannya dengan cara yang sama seperti saya sebagai pengembang, menggunakan salah satunya *
untuk mewakili sejumlah karakter. Sayangnya, pengguna khusus ini berasumsi Anda perlu menggunakannya satu wildcard untuk setiap karakter yang ingin Anda cocokkan. Dalam kasus mereka, mereka ingin memblokir semua email dari domain tertentu (yang merupakan fitur asli yang dimiliki Block Sender, tetapi mereka pasti tidak menyadarinya, yang merupakan masalah tersendiri). Jadi daripada menggunakan *@example.com
, mereka menggunakan **********@example.com
.
POV: Melihat pengguna menggunakan aplikasi Andaโฆ
Untuk menangani wildcard di server pekerja kami, kami menggunakan perpustakaan Node.js korek api, yang membantu pencocokan glob dengan mengubahnya menjadi ekspresi reguler. Perpustakaan ini kemudian akan berubah **********@example.com
menjadi sesuatu seperti regex berikut:
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
Jika Anda memiliki pengalaman dengan regex, Anda tahu bahwa regex bisa menjadi sangat rumit dengan sangat cepat, terutama pada tingkat komputasi. Mencocokkan ekspresi di atas dengan panjang teks yang masuk akal akan menjadi sangat mahal secara komputasi, yang pada akhirnya akan membebani CPU di server pekerja kami. Inilah sebabnya mengapa server mogok setiap beberapa menit; itu akan macet saat mencoba mencocokkan ekspresi reguler yang kompleks dengan alamat email. Jadi setiap kali pengguna ini menerima email, selain semua percobaan ulang yang kami lakukan untuk menangani kegagalan sementara, server kami akan crash.
Jadi bagaimana cara memperbaikinya? Jelas, perbaikan cepatnya adalah menemukan semua blok dengan beberapa wildcard secara berurutan dan memperbaikinya. Namun saya juga perlu melakukan pekerjaan yang lebih baik dalam membersihkan masukan pengguna. Setiap pengguna dapat memasukkan regex dan menghapus seluruh sistem dengan a serangan ReDoS.
Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!
Menangani kasus khusus ini cukup sederhana โ hapus karakter wildcard yang berurutan:
block = block.replace(/*+/g, '*')
Namun hal ini masih membuat aplikasi terbuka terhadap jenis serangan ReDoS lainnya. Untungnya ada sejumlah paket/perpustakaan untuk membantu kami dengan tipe ini juga:
Dengan menggunakan kombinasi solusi di atas dan tindakan pencegahan lainnya, saya dapat mencegah hal ini terjadi lagi. Namun hal ini merupakan pengingat yang baik bahwa Anda tidak akan pernah bisa mempercayai masukan pengguna, dan Anda harus selalu membersihkannya sebelum menggunakannya dalam aplikasi Anda. Saya bahkan tidak menyadari bahwa ini adalah potensi masalah hingga hal ini terjadi pada saya, jadi semoga hal ini dapat membantu orang lain menghindari masalah yang sama.
Punya pertanyaan, komentar, atau ingin berbagi cerita Anda sendiri? Hubungi kami Twitter!
- Konten Bertenaga SEO & Distribusi PR. Dapatkan Amplifikasi Hari Ini.
- PlatoData.Jaringan Vertikal Generatif Ai. Berdayakan Diri Anda. Akses Di Sini.
- PlatoAiStream. Intelijen Web3. Pengetahuan Diperkuat. Akses Di Sini.
- PlatoESG. Karbon, teknologi bersih, energi, Lingkungan Hidup, Tenaga surya, Penanganan limbah. Akses Di Sini.
- PlatoHealth. Kecerdasan Uji Coba Biotek dan Klinis. Akses Di Sini.
- Sumber: https://stackabuse.com/behind-the-scenes-never-trust-user-input/
- :memiliki
- :adalah
- :bukan
- $NAIK
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- Sanggup
- Tentang Kami
- atas
- Akun
- sebenarnya
- menambahkan
- tambahan
- alamat
- alamat
- lagi
- terhadap
- Semua
- mengizinkan
- sendirian
- juga
- selalu
- antara
- an
- dan
- Apa pun
- aplikasi
- Aplikasi
- ADALAH
- artikel
- AS
- meminta
- diasumsikan
- At
- Serangan
- menghindari
- sadar
- Backend
- BE
- Pohon Kacang
- menjadi
- menjadi
- sebelum
- di belakang
- dibalik layar
- makhluk
- Lebih baik
- Bit
- Memblokir
- pemblokiran
- Blok
- batas
- Istirahat
- dibangun di
- tapi
- by
- CAN
- Bisa Dapatkan
- yang
- kasus
- disebabkan
- menyebabkan
- tertentu
- karakter
- karakter
- memeriksa
- kode
- kombinasi
- komentar
- perusahaan
- kompleks
- rumit
- komputasi
- koneksi
- benar
- bisa
- tidak bisa
- Crash
- Hancur
- benar-benar
- membuat
- pelanggan
- pelanggan
- data
- ditangani
- memutuskan
- dikerahkan
- Pengembang
- MELAKUKAN
- tidak
- do
- domain
- don
- turun
- dua
- setiap
- mudah
- lain
- akhir
- berakhir
- berakhir
- Enter
- Seluruh
- kesalahan
- terutama
- Bahkan
- akhirnya
- Setiap
- semua orang
- segala sesuatu
- contoh
- mahal
- pengalaman
- ekspresi
- kegagalan
- hampir
- jauh
- Fitur
- Fitur
- beberapa
- Angka
- pikir
- Menemukan
- akhir
- Pertama
- Memperbaiki
- Fokus
- diikuti
- berikut
- Untuk
- Bekas
- dari
- mendapatkan
- mendapatkan
- gif
- pergi
- diberikan
- baik
- besar
- membimbing
- memiliki
- menangani
- Menangani
- hands-on
- terjadi
- Kejadian
- Memiliki
- membantu
- membantu
- Mudah-mudahan
- JAM
- melayang-layang
- Seterpercayaapakah Olymp Trade? Kesimpulan
- HTTPS
- i
- ID
- if
- in
- termasuk
- memasukkan
- sebagai gantinya
- ke
- isu
- masalah
- IT
- Diri
- Pekerjaan
- hanya
- terus
- Tahu
- Terakhir
- kemudian
- belajar
- pengetahuan
- Panjang
- Pelajaran
- membiarkan
- Tingkat
- LG
- Perpustakaan
- 'like'
- Mungkin
- ll
- lokal
- penebangan
- Panjang
- lagi
- tampak
- banyak
- Makro
- terbuat
- manual
- banyak
- Marketing
- Cocok
- sesuai
- mungkin
- me
- Memori
- menit
- kesalahan
- modern
- teknologi modern
- lebih
- paling
- banyak
- beberapa
- harus
- sempit
- asli
- dibutuhkan
- tak pernah
- New
- Fitur Baru
- berikutnya
- tidak
- simpul
- Node.js
- memberi tahu
- jumlah
- Kesempatan
- of
- on
- ONE
- Buka
- or
- Lainnya
- kami
- di luar
- sendiri
- Sakit
- bagian
- tertentu
- pola
- Konsultan Ahli
- plato
- Kecerdasan Data Plato
- Data Plato
- Posts
- potensi
- Praktis
- mencegah
- mungkin
- Masalah
- proses
- Produksi
- Produk
- Pertanyaan
- Cepat
- segera
- agak
- acak
- RE
- mencapai
- menyadari
- alasan
- masuk akal
- diterima
- menyambung kembali
- regex
- reguler
- peringatan
- menghapus
- menghapus
- mewakili
- benar
- Cincin
- Aturan
- Run
- berjalan
- s
- SaaS
- pengamanan
- sama
- adegan
- Pencarian
- tampak
- tampaknya
- pengirim
- Seri
- Server
- layanan
- bayangan
- Share
- berbagi
- lembar
- harus
- Sederhana
- sejak
- tidur
- So
- Solusi
- beberapa
- Seseorang
- sesuatu
- Space
- tertentu
- paku
- penyalahgunaan
- standar
- mulai
- Masih
- berhenti
- menyimpan
- Cerita
- sistem
- Mengambil
- Berbicara
- Teknologi
- sementara
- diuji
- tes
- teks
- dari
- bahwa
- Grafik
- mereka
- Mereka
- kemudian
- Sana.
- Ini
- mereka
- hal
- hal
- berpikir
- ini
- waktu
- kali
- untuk
- terlalu
- transisi
- mencoba
- Kepercayaan
- mencoba
- MENGHIDUPKAN
- Putar
- mengetik
- jenis
- mengerti
- sayangnya
- sampai
- upgrade
- us
- menggunakan
- bekas
- Pengguna
- Pengguna
- menggunakan
- berbagai
- Ve
- sangat
- melalui
- View
- Menunggu
- ingin
- ingin
- adalah
- bukan
- menonton
- Cara..
- we
- situs web
- minggu
- BAIK
- pergi
- adalah
- Apa
- ketika
- yang
- seluruh
- mengapa
- Wikipedia
- ingin
- dengan
- Kerja
- pekerja
- kerja
- akan
- penulisan
- tahun
- Kamu
- Anda
- zephyrnet.dll