10 Teratas Keamanan API OWASP: daftar periksa dengan perbaikan
Telusuri 10 risiko Keamanan API OWASP (edisi 2023) dengan skenario serangan nyata, perbaikan nyata, dan daftar periksa salin-tempel untuk tinjauan keamanan Anda.
API Anda melayani 10.000 permintaan per jam. Tiga dari permintaan tersebut datang dari penyerang yang melakukan perubahan
sebuah order_id parameter dan mengunduh setiap catatan pelanggan di database Anda. Anda menemukan
keluar ketika pengguna Anda melakukannya, di Twitter.
10 Teratas Keamanan API OWASP (edisi 2023) mengkatalogkan sepuluh risiko yang bertanggung jawab atas sebagian besar risiko
Pelanggaran API. Panduan ini membahas setiap risiko dengan penjelasan satu paragraf, serangan yang realistis
skenario, dan perbaikan konkrit. Jika titik akhir API botoi membantu Anda mendeteksi atau mencegah risiko, maka
titik akhir yang relevan disertakan dengan yang berfungsi curl memerintah.
API1:2023 Otorisasi tingkat objek (BOLA) rusak
BOLA terjadi ketika API mengembalikan data berdasarkan ID objek tanpa memeriksa apakah permintaan tersebut
pengguna memiliki objek itu. Seorang penyerang menelepon GET /api/orders/1001, mengambil data, lalu mengulanginya
melalui 1002, 1003, dan seterusnya. Setiap catatan dalam tabel kini terekspos.
BOLA menduduki peringkat risiko API nomor satu sejak daftar Keamanan API OWASP pertama pada tahun 2019.
Skenario serangan: Sebuah aplikasi pengiriman makanan memperlihatkan GET /api/orders/:id.
Penyerang menulis perulangan dari 1 hingga 100.000 dan mengunduh setiap pesanan, termasuk alamat pengiriman,
nomor telepon, dan detail metode pembayaran.
Berikut adalah kode yang rentan:
// Vulnerable: no ownership check
app.get("/api/orders/:id", async (req, res) => {
const order = await db.orders.findById(req.params.id);
res.json(order); // Any user can read any order
});
Dan inilah perbaikannya:
// Fixed: verify the requesting user owns the resource
app.get("/api/orders/:id", async (req, res) => {
const order = await db.orders.findById(req.params.id);
if (!order) return res.status(404).json({ error: "Not found" });
if (order.userId !== req.user.id) {
return res.status(403).json({ error: "Forbidden" });
}
res.json(order);
});
Setiap titik akhir yang menerima ID dari klien memerlukan pemeriksaan kepemilikan. Tidak ada pengecualian. Gunakan
middleware atau filter kueri (misalnya, WHERE user_id = ?) untuk menerapkan ini pada lapisan data.
API2:2023 Otentikasi rusak
Otentikasi yang rusak mencakup pembuatan token yang lemah, validasi token yang hilang, pengisian kredensial serangan, dan titik akhir yang menerima token yang kedaluwarsa atau dirusak. Penyerang menargetkan titik akhir login dengan daftar kredensial yang dilanggar, atau mereka mencuri token dari penyimpanan yang tidak aman.
Skenario serangan: Seorang penyerang memperoleh daftar 10 juta pasangan email/kata sandi dari
pelanggaran data. Mereka menulis skrip yang menguji setiap pasangan terhadap pasangan Anda POST /api/login
titik akhir. API Anda tidak memiliki batasan kecepatan pada upaya login, sehingga penyerang menyusupi 2.000 akun
satu jam.
Memperbaiki: Menerapkan pembatasan kecepatan pada titik akhir autentikasi (5 upaya per menit per IP). Memerlukan autentikasi multifaktor untuk operasi sensitif. Periksa kredensial pengguna terhadap yang diketahui pelanggaran sebelum mengizinkan pembuatan akun.
Itu API pemeriksaan pelanggaran botoi memberitahu Anda apakah alamat email muncul dalam pelanggaran data yang diketahui:
curl -s -X POST https://api.botoi.com/v1/breach/check \\
-H "Content-Type: application/json" \\
-d '{
"email": "user@example.com"
}'
Tanggapan:
{
"success": true,
"data": {
"breached": true,
"count": 3,
"breaches": [
{ "name": "ExampleCorp", "date": "2024-01-15", "dataTypes": ["email", "password"] },
{ "name": "DataDump2023", "date": "2023-08-22", "dataTypes": ["email", "username"] },
{ "name": "LeakedDB", "date": "2022-11-03", "dataTypes": ["email", "phone"] }
]
}
}
Panggilan /v1/breach/check selama pendaftaran atau pengaturan ulang kata sandi. Jika email muncul dalam pelanggaran,
meminta pengguna untuk memilih kata sandi yang lebih kuat dan unik serta mengaktifkan autentikasi dua faktor.
API3:2023 Otorisasi tingkat properti objek rusak
Risiko ini menggabungkan penugasan massal dan paparan data yang berlebihan. Penugasan massal terjadi ketika API
mengikat bidang isi permintaan langsung ke model data tanpa pemfilteran. Seorang pengguna mengirim
"role": "admin" dalam pembaruan profil dan mendapat hak istimewa yang lebih tinggi. Paparan data yang berlebihan
terjadi ketika API mengembalikan bidang internal (ID database, kata sandi hash, tanda admin) klien
seharusnya tidak pernah melihat.
Skenario serangan: Aplikasi SaaS memungkinkan pengguna memperbarui profil mereka melalui
PUT /api/users/:id. Backend menerima isi permintaan lengkap dan menulisnya ke database.
Seorang penyerang menambahkan "plan": "enterprise" sesuai permintaan dan mendapat akses gratis ke fitur premium.
Memperbaiki: Gunakan daftar yang diizinkan secara eksplisit untuk bidang yang dapat ditulis. Jangan pernah mengikat data permintaan mentah ke data Anda model data. Gunakan DTO respons terpisah yang mengecualikan kolom internal. Validasi setiap properti yang masuk terhadap skema sebelum diproses.
API4:2023 Konsumsi sumber daya tidak dibatasi
API yang menerima permintaan tanpa batas memungkinkan penyerang menghabiskan tagihan infrastruktur Anda dan menghabiskan database
koneksi, atau memicu penolakan layanan. Hal ini berlaku untuk batas kecepatan yang hilang, kueri tidak terbatas
parameter (misalnya, ?limit=1000000), unggahan file tanpa batasan ukuran, dan titik akhir itu
memicu pekerjaan latar belakang yang mahal.
Skenario serangan: Titik akhir API menghasilkan laporan PDF. Seorang penyerang mengirim 500 permintaan bersamaan, masing-masing meminta laporan 200 halaman. Kelompok pekerja Anda terisi, dan sah pengguna mendapatkan 503 kesalahan selama 20 menit berikutnya.
Memperbaiki: Tambahkan batasan tarif per pengguna dan per IP. Batasi batas penomoran halaman dengan sisi server maksimal. Tetapkan batas ukuran unggahan file. Gunakan pemrosesan berbasis antrian untuk operasi yang mahal.
// Express rate limiter per user
import rateLimit from "express-rate-limit";
const apiLimiter = rateLimit({
windowMs: 60 * 1000, // 1 minute
max: 30, // 30 requests per minute per IP
standardHeaders: true,
legacyHeaders: false,
message: { error: "Rate limit exceeded. Try again in 60 seconds." },
});
app.use("/api/", apiLimiter);
API5:2023 Otorisasi tingkat fungsi rusak
Kelemahan otorisasi tingkat fungsi memungkinkan pengguna biasa menghubungi titik akhir admin. Pola khasnya: an
panggilan panel admin DELETE /api/admin/users/:id. Bagian depan menyembunyikan tombol
pengguna non-admin, namun titik akhir API itu sendiri tidak memeriksa peran. Setiap pengguna yang diautentikasi yang
menemukan URL dapat menghapus akun.
Skenario serangan: Seorang pengembang menemukan /api/admin/export-all-users
dalam bundel JavaScript. Mereka menyebutnya dengan token pengguna biasa dan mengunduh pengguna penuh
basis data.
Memperbaiki: Periksa peran pengguna di lapisan API untuk setiap titik akhir admin. Jangan mengandalkan
frontend untuk menyembunyikan fungsionalitas. Admin grup merutekan di belakang middleware yang memverifikasi
role === "admin" sebelum memproses permintaan tersebut.
API6:2023 Akses tidak terbatas ke alur bisnis sensitif
Beberapa aliran API berbahaya dalam skala besar bahkan ketika setiap permintaan diotorisasi. Membeli item dengan inventaris terbatas, membuat akun uji coba gratis, mengirimkan kode referensi; aliran ini rusak saat diotomatisasi. Bot mendaftarkan 10.000 akun gratis atau membeli setiap tiket dalam penjualan kilat sebelum pengguna sebenarnya memuat halaman.
Skenario serangan: Pengecer sepatu kets menulis bot yang menelepon
POST /api/checkout 500 kali dalam detik pertama penurunan terbatas. Setiap pasang terjual
ke bot. Pelanggan manusia melihat "terjual habis" sebelum halaman selesai dimuat.
Memperbaiki: Tambahkan CAPTCHA atau tantangan bukti kerja ke aliran bernilai tinggi. Lacak perangkat sidik jari untuk mendeteksi otomatisasi. Tetapkan batas pembelian per pengguna. Gunakan akses berbasis antrian untuk penjualan kilat, bukan titik akhir yang datang lebih dulu dilayani.
API7:2023 Pemalsuan permintaan sisi server (SSRF)
SSRF terjadi ketika API menerima URL dari klien dan mengambilnya di sisi server tanpa
memvalidasi target. Seorang penyerang menyediakan http://169.254.169.254/latest/meta-data/
dan server Anda mengembalikan kredensial instans AWS. Atau mereka menargetkan
http://localhost:6379/ dan berinteraksi dengan instance Redis Anda.
Skenario serangan: Integrasi webhook memungkinkan pengguna menentukan URL panggilan balik.
Seorang penyerang menyetel panggilan balik ke http://169.254.169.254/latest/meta-data/iam/security-credentials/
dan menerima kredensial peran IAM penyedia cloud Anda di payload webhook.
// Block internal network requests
const BLOCKED_RANGES = [
/^10\\./, /^172\\.(1[6-9]|2\\d|3[01])\\./, /^192\\.168\\./,
/^127\\./, /^0\\./, /^169\\.254\\./,
/^localhost$/i, /^\\[::1\\]$/,
];
function isSafeUrl(urlString) {
try {
const url = new URL(urlString);
const hostname = url.hostname;
return !BLOCKED_RANGES.some((re) => re.test(hostname));
} catch {
return false;
}
}
app.post("/api/fetch-url", async (req, res) => {
const { url } = req.body;
if (!isSafeUrl(url)) {
return res.status(400).json({ error: "URL targets a blocked network range" });
}
// proceed with external fetch
});
Memperbaiki: Validasi dan izinkan URL tujuan. Blokir rentang IP pribadi dan cloud titik akhir metadata. Selesaikan DNS sebelum membuat permintaan untuk mencegah pengikatan ulang DNS. Jalankan keluar permintaan dari segmen jaringan yang terisolasi.
API8:2023 Kesalahan konfigurasi keamanan
Kesalahan konfigurasi adalah kategori risiko terluas. Ini termasuk batasan CORS yang hilang, kesalahan verbose pesan yang membocorkan jejak tumpukan, kredensial default di panel admin, metode HTTP yang tidak perlu diaktifkan, TLS tidak diterapkan, dan header keamanan tidak ada. Setiap kesalahan konfigurasi akan menciptakan titik masuk.
Skenario serangan: API mengembalikan jejak tumpukan penuh dalam respons kesalahan produksi. Sebuah penyerang memicu kesalahan dengan sengaja, membaca jejak tumpukan, mengidentifikasi ORM dan versi database, lalu membuat muatan injeksi berdasarkan kerentanan yang diketahui dalam versi tersebut.
Memperbaiki: Hapus jejak tumpukan dari respons produksi. Setel CORS untuk hanya mengizinkan domain Anda. Nonaktifkan metode HTTP yang tidak Anda gunakan. Terapkan TLS di mana pun. Jalankan pemeriksaan header keamanan otomatis. Sanitasi semua keluaran HTML untuk mencegah XSS.
Itu menerbitkan API sanitasi HTML strip tag dan atribut berbahaya dari HTML yang disediakan pengguna:
curl -s -X POST https://api.botoi.com/v1/html-sanitize \\
-H "Content-Type: application/json" \\
-d '{
"html": "<p>Hello</p><script>document.cookie</script><img onerror=alert(1) src=x>"
}'
Tanggapan:
{
"success": true,
"data": {
"sanitized": "<p>Hello</p><img src=\\"x\\">"
}
}
Itu <script> tag dan itu onerror atribut dihapus. HTML yang aman
dikembalikan. Panggil titik akhir ini sebelum menyimpan atau merender HTML apa pun yang disediakan pengguna.
API9:2023 Manajemen inventaris yang tidak tepat
Versi API lama, titik akhir pementasan yang terlupakan, dan rute yang tidak terdokumentasi membuat serangan muncul ke permukaan Anda
jangan memantau. Penyerang memindai /v1/, /v2/, /api-dev/,
Dan /internal/ jalur. Mereka menemukan titik akhir yang tidak digunakan lagi dan tidak memiliki kontrol keamanan
Anda menambahkan ke versi saat ini.
Skenario serangan: Tim Anda dikirim /v2/users dengan akses berbasis peran
kontrol. Tetapi /v1/users masih berjalan dalam produksi tanpa izin apa pun. Seorang penyerang
menemukan jalur v1 melalui file Swagger publik dan menarik seluruh tabel pengguna.
Memperbaiki: Pertahankan inventaris API yang lengkap. Nonaktifkan versi lama; jangan tinggalkan mereka menjalankan "kalau-kalau ada yang masih menggunakannya." Gerbang setiap versi di belakang middleware autentikasi yang sama. Pindai infrastruktur Anda sendiri untuk jalur terbuka pada jadwal reguler.
API10:2023 Konsumsi API yang tidak aman
API Anda memanggil layanan pihak ketiga: pemroses pembayaran, penyedia email, API geocoding. Jika kamu memercayai tanggapan mereka tanpa validasi, pihak ketiga yang disusupi atau jahat dapat memasukkan data ke dalam sistem Anda. Hal ini termasuk memercayai URL pengalihan, menguraikan JSON yang tidak divalidasi, atau menyimpan tanggapan pihak ketiga tanpa sanitasi.
Skenario serangan: Aplikasi Anda mengambil data perusahaan dari API pengayaan pihak ketiga
dan menyimpan company_name bidang langsung di database Anda. API pengayaan didapat
dikompromikan, dan penyerang menyuntikkan <script> tag ke dalam nama perusahaan. Setiap
pengguna yang melihat profil perusahaan di dasbor Anda menjalankan skrip.
Memperbaiki: Validasi dan sanitasi semua tanggapan pihak ketiga sebelum menyimpan atau merender mereka. Gunakan validasi skema pada data yang masuk. Tetapkan batas waktu pada panggilan eksternal. Terapkan masukan yang sama validasi terhadap data pihak ketiga yang Anda terapkan pada input pengguna.
Deteksi paparan data sensitif dalam respons API Anda
Risiko API1 dan API3 sering kali mengakibatkan data sensitif keluar dari API Anda. Itu API deteksi PII botoi memindai teks untuk Nomor Jaminan Sosial, nomor kartu kredit, alamat email, nomor telepon, alamat IP, dan tanggal lahir. Jalankan terhadap badan respons API Anda dalam pengujian integrasi untuk mendeteksi ketidaksengajaan kebocoran data sebelum penerapan.
curl -s -X POST https://api.botoi.com/v1/pii/detect \\
-H "Content-Type: application/json" \\
-d '{
"text": "Customer SSN is 123-45-6789 and card is 4111111111111111"
}'
Tanggapan:
{
"success": true,
"data": {
"found": true,
"count": 2,
"findings": [
{
"type": "ssn",
"value": "123-45-6789",
"start": 17,
"end": 28,
"masked": "***-**-6789"
},
{
"type": "credit_card",
"value": "4111111111111111",
"start": 42,
"end": 58,
"masked": "************1111"
}
]
}
}
Jika respons API Anda memicu temuan, titik akhir Anda mengembalikan data yang tidak boleh dilihat klien. Perbaiki kueri atau DTO untuk mengecualikan bidang tersebut.
Enkripsi data sensitif saat disimpan
Saat API Anda menyimpan konfigurasi, token, atau kredensial sensitif, enkripsikan sebelum menulis ke basis data. Itu API enkripsi botoi menyediakan enkripsi AES-256-CBC:
curl -s -X POST https://api.botoi.com/v1/encrypt/encrypt \\
-H "Content-Type: application/json" \\
-d '{
"text": "sensitive-api-token-abc123",
"password": "your-secret-key"
}'
Tanggapan:
{
"success": true,
"data": {
"encrypted": "U2FsdGVkX1+abc...encrypted_output_here",
"algorithm": "aes-256-cbc"
}
}
Simpan keluaran terenkripsi. Dekripsi dengan /v1/encrypt/decrypt hanya jika nilainya
dibutuhkan. Ini membatasi radius ledakan jika penyerang memperoleh akses baca ke database Anda melalui a
Kerentanan BOLA atau injeksi SQL.
Daftar periksa 10 Besar Keamanan API OWASP
Cetak tabel ini atau tambahkan ke templat tinjauan keamanan Anda. Periksa setiap item sebelum rilis API apa pun.
| Mempertaruhkan | Memeriksa | titik akhir botoi |
|---|---|---|
| API1 ADALAH | Setiap titik akhir yang menerima ID objek memverifikasi kepemilikan | |
| API2 Otentikasi Rusak | Tingkat login terbatas; token kedaluwarsa; MFA pada operasi sensitif | /v1/breach/check |
| Otentikasi Properti API3 | Bidang permintaan diizinkan; respons DTO tidak termasuk internal | /v1/pii/detect |
| Batas Sumber Daya API4 | Batas kecepatan, batas penomoran halaman, batas ukuran file diterapkan | |
| Otentikasi Fungsi API5 | Titik akhir admin memeriksa peran di lapisan API, bukan di frontend | |
| Alur Bisnis API6 | CAPTCHA/bukti kerja pada aliran bernilai tinggi; batas per pengguna | |
| API7 SSRF | URL yang diberikan pengguna divalidasi; rentang pribadi diblokir | |
| Kesalahan konfigurasi API8 | Tidak ada jejak tumpukan; dibatasi CORS; HTML dibersihkan | /v1/html-sanitize |
| Inventaris API9 | Versi API lama dinonaktifkan; semua rute didokumentasikan | |
| API10 Konsumsi Tidak Aman | Respons pihak ketiga divalidasi dan dibersihkan sebelum disimpan | /v1/html-sanitize |
Ke mana harus pergi setelah ini
Dokumentasi lengkap 10 Teratas Keamanan API OWASP ada di owasp.org/API-Security. Setiap halaman risiko mencakup metode deteksi, contoh skenario serangan, dan referensi ke CWE.
Untuk pemeriksaan otomatis, integrasikan titik akhir botoi di atas ke dalam saluran CI Anda. Jalankan deteksi PII terhadap perlengkapan respons API. Sanitasi HTML yang disimpan saat menulis. Periksa email pengguna baru dari pelanggaran database saat mendaftar. Ini adalah tambahan kecil pada rangkaian pengujian Anda yang menangkap pemindai risiko rindu.
FAQ
- Apa yang dimaksud dengan 10 Besar Keamanan API OWASP?
- 10 Teratas Keamanan API OWASP adalah daftar sepuluh risiko keamanan API paling kritis, yang dikelola oleh Proyek Keamanan Aplikasi Open Worldwide. Edisi 2023 mencakup otorisasi tingkat objek yang rusak, autentikasi yang rusak, otorisasi tingkat properti objek yang rusak, konsumsi sumber daya yang tidak dibatasi, otorisasi tingkat fungsi yang rusak, akses tidak terbatas ke alur bisnis sensitif, pemalsuan permintaan sisi server, kesalahan konfigurasi keamanan, manajemen inventaris yang tidak tepat, dan konsumsi API yang tidak aman.
- Seberapa sering 10 Teratas Keamanan API OWASP diperbarui?
- OWASP merilis API Security Top 10 pertama pada tahun 2019 dan memperbaruinya pada tahun 2023. Tidak ada jadwal pembaruan yang tetap. Tim proyek mengumpulkan data dari insiden keamanan, laporan bug bounty, dan kontribusi komunitas, lalu menerbitkan edisi baru ketika lanskap ancaman sudah cukup berubah sehingga memerlukan edisi baru.
- Apa itu BOLA dan mengapa ini merupakan risiko API nomor satu?
- BOLA (Otorisasi Tingkat Objek Rusak) terjadi ketika titik akhir API menerima ID objek dari klien dan mengembalikan data tanpa memverifikasi bahwa pengguna yang meminta adalah pemilik objek tersebut. Penyerang mengubah ID dalam permintaan dan mengakses data pengguna lain. Ini menempati urutan pertama karena umum, mudah dieksploitasi, dan sering kali mengekspos catatan sensitif dalam skala besar.
- Bisakah alat otomatis menangkap semua 10 risiko Teratas Keamanan API OWASP?
- Pemindai otomatis menangkap kesalahan konfigurasi (API8), batas kecepatan yang hilang (API4), dan beberapa pola injeksi (melalui API8). Namun kelemahan otorisasi (API1, API3, API5) memerlukan pemahaman logika bisnis yang tidak dimiliki pemindai. Anda memerlukan tinjauan kode manual, pengujian penetrasi, dan pemeriksaan tingkat arsitektur untuk cakupan yang lengkap.
- Bagaimana cara saya memprioritaskan risiko OWASP API mana yang harus diperbaiki terlebih dahulu?
- Mulailah dengan API1 (BOLA) dan API2 (Otentikasi Rusak) karena keduanya menyebabkan pelanggaran data langsung. Kemudian atasi API4 (Konsumsi Sumber Daya Tidak Terbatas) untuk mencegah penolakan layanan. Setelah itu, selesaikan risiko yang tersisa berdasarkan titik akhir mana yang menangani data paling sensitif dalam aplikasi Anda.
Mulai membangun dengan botoi
150+ endpoint API untuk pencarian, pemrosesan teks, pembuatan gambar, dan utilitas developer. Paket gratis, tanpa kartu kredit.