Mengamankan DApp dan user: perlindungan private key dan env, ancaman phishing signature, praktik approval limit dan revoke.cash, verifikasi source contract, audit dependency, serta perlindungan nonce dan replay

Setelah di episode 15 infrastruktur rapi, pada episode ini kita membahas hal yang paling sering merugikan user: keamanan. Pada 2025, kerugian exploit diperkirakan mencapai $3-4 miliar — dan sebagian besar bukan karena math kripto yang retak, melainkan kesalahan desain, kecerobohan key, dan phishing signature.
Mengapa episode ini penting? Karena sebagai developer DApp, kalian memegang tanggung jawab ganda: melindungi kode kalian (kontrak, dependency, env) dan melindungi user (dari phishing yang menyamar sebagai DApp kalian). Keamanan bukan fitur tambahan — ini prasyarat produksi.
Aturan pertama yang tidak bisa ditawar:
import.meta.env di frontend terlihat publik — hanya boleh berisi key yang memang publik (RPC key, project ID).VITE_ALCHEMY_KEY=xxxx # publik, boleh di bundle
VITE_WC_PROJECT_ID=xxxx # publik, boleh di bundle
SERVER_SIGNER_PRIVATE_KEY=xxxx # RAHASIA — hanya di serverPerhatikan pola VITE_ (terlihat client) vs SERVER_ (hanya server). Campur keduanya adalah kesalahan klasik yang membuat key bocor ke bundle publik.
Ancaman nomor satu wallet user. Modus: attacker meminta user menandatangani data atau transaksi yang terlihat tidak berbahaya — misalnya "claim airdrop" — padahal signature tersebut memberi kontrol atas aset.
Protection yang harus DApp kalian terapkan:
Danger
Selalu validasi permission to sign di DApp kalian: tampilkan deskripsi jelas setiap signature yang diminta, dan jangan pernah meniru pola "sign anything" yang dipakai attacker. User yang terbiasa blind-sign di DApp kalian akan melakukan hal yang sama di situs phishing yang menyamar.
Ketika user approve token (episode 11), mereka memberi kontrak hak mengambil token dalam jumlah tertentu. Risiko: jika kontrak itu ternyata jahat atau diretas, dana bisa ditarik.
Best practice yang harus DApp kalian dorong:
maxUint256 tanpa alasan.Revoke tool standar: revoke.cash — mendeteksi allowance yang tersisa dan memungkinkan mencabutnya. Sebagai developer, pastikan UI kalian tidak pernah "memaksa" user memberikan approval tanpa batas.
User perlu bisa memeriksa bahwa DApp berjalan di kontrak yang benar. Ini dilakukan dengan:
Kode kalian tidak hanya kontrak — dependency frontend/backend juga target:
npm audit
bun auditGunakan tool SCA (Software Composition Analysis), pin versi, dan waspada pada paket typosquatting (nama mirip paket populer). Untuk kontrak, audit pihak ketiga wajib sebelum dana produksi masuk — kerugian exploit $3-4B per tahun membuktikan alasannya.
Rangkuman yang sudah kalian pelajari di episode 16:
VITE_ hanya untuk key publik.Inti yang harus dibawa pulang:
Di episode 17 selanjutnya, kita membahas account abstraction & smart wallets (EIP-4337) — UserOperation, EntryPoint, bundlers dan paymasters, fitur social recovery, passkey login, gasless transaction, dan spending limits yang menjadi pintu menuju ratusan juta user baru. Sampai jumpa di episode 17!