Keselamatan Aplikasi: OWASP Top 10:2025
Log masuk untuk menyimpan kemajuan anda merentas peranti. Sehingga itu, ia disimpan dalam pelayar ini.
Mengapa ini penting
Keselamatan ialah tempat kod yang dijana AI paling kerap gagal, dan paling mahal akibatnya. Data Veracode 2026 meletakkan kadar lulus keselamatan kod AI pada kira-kira 56%. Modul ini mengambil masa dua minggu dan merupakan gate paling sukar dalam program ini.
Hasil pembelajaran
- Gunakan OWASP Top 10:2025 pada aplikasi anda sendiri.
- Laksanakan authentication dan authorization dengan betul (OAuth/OIDC, sesi, putaran JWT, IAM, RLS).
- Urus secret supaya tiada satu pun sampai ke kod, bundle frontend atau log.
- Cegah injection (SQL, XSS, SSRF) dan serangan pelayar (CSRF, salah konfigurasi CORS).
- Pertahankan perimeter dengan rate limiting, WAF dan perlindungan DDoS.
- Jalankan SAST, DAST, imbasan secret dan imbasan dependency dalam CI.
OWASP Top 10:2025
| ID | Risiko | Kegagalan biasa kod AI |
|---|---|---|
| A01 | Broken Access Control | Endpoint semak log masuk tetapi tidak semak pemilikan; RLS dimatikan; IDOR melalui ID berjujukan |
| A02 | Security Misconfiguration | Mod debug hidup, kelayakan lalai, CORS * yang terlalu longgar, ralat terlalu terperinci, storage bucket terbuka |
| A03 | Software Supply Chain Failures | Pakej yang dihalusinasi atau tidak di-pin, dependency yang dikompromi, build tanpa tandatangan |
| A04 | Cryptographic Failures | Kripto buatan sendiri, kata laluan MD5/SHA1, secret dalam teks biasa |
| A05 | Injection | SQL yang dicantum dengan rentetan, dangerouslySetInnerHTML, arahan shell dengan input pengguna |
| A06 | Insecure Design | Tiada threat model; penyalahgunaan logik perniagaan (kuantiti negatif, kupon bertindan) |
| A07 | Authentication Failures | Tiada rate limit pada log masuk, aliran reset yang lemah, token hayat panjang, tiada MFA |
| A08 | Software or Data Integrity Failures | Webhook tidak disahkan, kemas kini tanpa tandatangan, deserialisasi tidak selamat |
| A09 | Security Logging and Alerting Failures | Tiada audit log; tiada amaran untuk brute force; secret dalam log |
| A10 | Mishandling of Exceptional Conditions | Fail-open bila ralat, exception ditelan, stack trace dipaparkan kepada pengguna |
Baharu dalam 2025: Supply Chain menjadi kategori tersendiri di A03, dan Mishandling of Exceptional Conditions masuk di A10. Kedua-duanya tepat di tempat alat AI paling lemah.
Pelajaran
5.1 Kawalan akses (A01, 68)
- Authentication = siapa anda. Authorization = apa yang anda dibenarkan buat. Kod AI biasanya buat yang pertama dan lupa yang kedua.
- Semak authorization pada setiap request, di sisi server, untuk setiap objek (
WHERE id = $1 AND org_id = $currentOrg). - Tolak secara lalai. Peranan dan kebenaran di satu tempat (modul polisi atau RLS), bukan pernyataan
ifyang bertaburan. - IAM untuk infrastruktur: setiap servis mendapat identiti sendiri dengan least privilege; tiada kunci admin yang dikongsi; akaun dev/staging/prod yang berasingan.
- Jangan sekali-kali dedahkan kunci service-role / admin kepada client. Dalam Supabase, kunci anon memang awam secara reka bentuk, jadi RLS ialah satu-satunya tembok anda.
5.2 Authentication, OAuth dan token (69, 70)
- Jangan bina auth dari kosong. Gunakan penyedia yang terbukti (Supabase Auth, Clerk, Auth0, WorkOS untuk SSO enterprise).
- OAuth 2.0 / OIDC: aliran Authorization Code dengan PKCE untuk pelayar dan mudah alih. Sahkan
state,nonce, issuer, audience. - Sesi: cookie
HttpOnly,Secure,SameSite=LaxatauStrict. Jangan simpan token dalam localStorage. - Putaran JWT: access token hayat pendek (5 hingga 15 minit), refresh token yang berputar dengan pengesanan guna semula, kunci tandatangan diputar melalui JWKS dengan key ID (
kid), jangan sekali-kalialg: none, sentiasa sahkan tandatangan, tarikh luput dan audience. - Pembeli enterprise menjangkakan: MFA, SSO (SAML/OIDC), provisioning SCIM, pembatalan sesi.
5.3 Pengurusan secret (67)
- Secret disimpan dalam secrets manager atau env var platform, bukan dalam git, bukan dalam pemboleh ubah
NEXT_PUBLIC_*/VITE_*(yang itu dihantar ke pelayar). - Hook pre-commit + imbasan CI (gitleaks, GitHub secret scanning dengan push protection).
- Secret yang bocor mesti diputar, bukan sekadar dipadam: sejarah git dan fork menyimpannya selama-lamanya.
- Kunci berasingan untuk setiap persekitaran; kunci API dengan skop paling kecil (kunci Stripe terhad, token berskop).
- Had perbelanjaan pada setiap kunci API berbayar (LLM, SMS, peta). Jika tidak, kunci yang bocor ialah cek kosong.
5.4 Kriptografi dan penyulitan (72, A04)
- Kata laluan: argon2id atau bcrypt melalui penyedia auth anda. Jangan sekali-kali hash sendiri dengan SHA.
- Penyulitan at rest: penyulitan DB/storage terurus dihidupkan, backup disulitkan. Penyulitan peringkat medan untuk data sangat sensitif (nombor kad pengenalan, butiran bank), dengan kunci dalam KMS.
- Gunakan library (libsodium, KMS platform); jangan sekali-kali cipta kripto sendiri.
5.5 Injection (78, 79, 80)
- SQL injection: query berparameter atau query builder/ORM. Jangan sekali-kali sisipkan rentetan ke dalam SQL, termasuk dalam jalan pintas "raw".
- XSS: framework melakukan escape secara lalai; zon bahaya ialah
dangerouslySetInnerHTML,v-html, dan memaparkan markdown atau output LLM sebagai HTML. Sanitasi dengan DOMPurify; tetapkan Content-Security-Policy. - SSRF: mana-mana ciri yang mengambil URL yang dibekalkan pengguna (pratonton pautan, webhook, "import dari URL", ejen AI yang melayari web) boleh diarahkan ke
169.254.169.254(metadata cloud) atau servis dalaman. Allowlist domain, resolve dan sekat julat IP persendirian, matikan redirect atau semak semula selepas setiap satu, jalankan fetcher dalam rangkaian terasing.
5.6 Keselamatan pelayar (76, 77)
- CORS bukan sempadan keselamatan untuk server anda; ia mengawal origin mana yang dibenarkan pelayar membaca respons. Jangan sekali-kali pantulkan
Originsembarangan bersamaAccess-Control-Allow-Credentials: true. Allowlist origin yang tepat. - CSRF: cookie
SameSiteserta token CSRF atau semakan origin untuk request yang mengubah keadaan apabila menggunakan auth berasaskan cookie. - Header keselamatan: CSP, HSTS,
X-Content-Type-Options: nosniff,Referrer-Policy,frame-ancestors.
5.7 Perimeter: rate limiting, WAF, DDoS (1, 74, 75)
- Rate limit mengikut IP, pengguna dan kunci API, dengan had lebih ketat pada log masuk, pendaftaran, reset kata laluan, OTP, dan setiap endpoint yang menelan kos (LLM, SMS, e-mel).
- Algoritma: token bucket atau sliding window, disimpan dalam Redis atau di edge. Pulangkan
429denganRetry-After. - WAF (Cloudflare, AWS WAF) dengan peraturan OWASP terurus; perlindungan bot pada pendaftaran.
- Perlindungan DDoS kebanyakannya datang daripada CDN anda; pastikan origin tidak boleh dicapai secara terus dan dipintas.
5.8 Keadaan luar biasa (A10)
- Fail closed: jika semakan auth melontar ralat, tolak. Jika semakan penipuan tamat masa, tahan transaksi, jangan luluskan.
- Jangan sekali-kali tunjukkan stack trace kepada pengguna; log ia bersama request ID.
- Tangkap ralat yang spesifik; jangan telan semua exception.
5.9 Threat modelling (A06)
STRIDE dalam 30 minit bagi setiap ciri: Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege. Lukis sempadan kepercayaan; senaraikan kes penyalahgunaan ("bagaimana jika kuantiti ialah -1?").
5.10 Keselamatan dalam pipeline
| Jenis alat | Contoh | Apa yang ditangkap |
|---|---|---|
| Imbasan secret | gitleaks, GitHub push protection | Kunci dalam kod |
| SAST | Semgrep, CodeQL | Injection, corak tidak selamat |
| SCA | Dependabot, Snyk, OSV-Scanner | Dependency yang terdedah |
| DAST | OWASP ZAP | Salah konfigurasi runtime, header, XSS |
| Container/IaC | Trivy, Checkov | Image dan konfigurasi infra yang buruk |
Makmal 5 (dua minggu): Serang aplikasi anda sendiri
Minggu A, Pecahkan: gunakan akaun kedua dan proksi pelayar (ZAP atau Burp Community).
- Cuba baca/sunting rekod pengguna lain dengan menukar ID (IDOR).
- Panggil pangkalan data secara terus dengan kunci anon awam.
- Suntik
<script>ke dalam setiap medan teks dan output markdown/LLM. - Arahkan mana-mana ciri yang mengambil URL ke
http://169.254.169.254/danhttp://localhost. - Brute force log masuk dan reset kata laluan; hentam endpoint yang paling mahal.
- Cari secret dalam bundle JS production.
Minggu B, Baiki dan buktikan: baiki setiap penemuan, tambah satu regression test bagi setiap penemuan, sambungkan pengimbas ke dalam CI.
Definition of Done
Pek prompt AI
- "Bertindak sebagai penguji penembusan. Untuk setiap route dalam aplikasi ini, senaraikan bagaimana pengguna yang sudah log masuk boleh mengakses data pengguna lain. Kemudian tulis ujian untuk setiap satu."
- "Cari setiap tempat secret atau env var dibaca. Tandakan mana-mana yang boleh sampai ke bundle client."
- "Cari setiap tempat kita mengambil URL yang diterbitkan daripada input pengguna. Tambah perlindungan SSRF yang menyekat julat persendirian, loopback dan link-local selepas resolusi DNS."
- "Cari setiap blok catch. Tandakan mana-mana yang fail open atau menelan ralat."