Panduan / Keamanan informasi

Keamanan API GraphQL: izin objek, query, dan batas penggunaan

Satu endpoint GraphQL dapat menjalankan banyak permintaan data. Periksa izin setiap objek dan operasi, batasi pekerjaan query, lalu bedakan penolakan yang benar dari respons yang masih membocorkan sebagian data.

Di halaman ini

Apa yang berbeda pada GraphQL?

GraphQL tidak menggantikan pemeriksaan izin aplikasi. Ia menyediakan bahasa query, schema serta aturan pemrosesan. Schema dapat menyatakan suatu field bertipe teks, tetapi belum menentukan apakah pelanggan A berhak membacanya dari laporan B.

Resolver adalah fungsi yang mengambil atau mengolah nilai suatu field. Permintaan dapat memakai alias untuk memberi nama hasil berbeda dan fragment untuk memakai ulang pilihan field. Mulai dari panduan API umum untuk inventaris token, pemakai, data dan batas izin pengujian; halaman ini memperdalam perilaku GraphQL.

Tetapkan izin pada jalur pengambilan data

Contoh fiktif: akun A hanya boleh membaca laporan A. Pemeriksaan pemilik perlu tetap berlaku ketika objek diakses dari field lain, daftar, relasi atau mutation. Simpan aturan pada lapisan yang dipakai bersama, bukan hanya satu tombol atau resolver luar.

Periksa juga izin field, misalnya ringkasan yang boleh dilihat anggota tetapi catatan internal hanya untuk petugas. Autentikasi yang berhasil belum memberi semua izin itu. Cache dan loader perlu mempertahankan batas akun/tenant; hasil untuk satu pelanggan tidak boleh dipakai oleh pelanggan lain.

Jalankan contoh dengan parser dan executor nyata

Unduh source dan hasil lab keamanan aplikasi 1.0. Paket memakai GraphQL.js 17.0.2; versi bahasa rujukan adalah spesifikasi September 2025. Dijalankan 2 Oktober 2026 pada Node 24.21.0:

npm ci --ignore-scripts
node graphql-lab.mjs

Script menjalankan parse, validate dan execute terhadap schema nyata dengan dua laporan buatan. Identitas A pada konteks uji ditetapkan script; autentikasi HTTP, database dan layanan pelanggan tidak terlibat.

Permintaan berikut menunjukkan alias. mine dan other hanya mengubah nama hasil, bukan izin:

{
  mine: report(id: "A") { body }
  other: report(id: "B") { body }
}
Kasus yang dijalankan Hasil bad → fixed dan retest
Laporan sendiri REPORT_A_DEMO tetap tersedia.
Laporan B dari akun A Data B terbuka → field laporan null, error FORBIDDEN, tanpa penanda B.
Alias laporan A dan B Keduanya terbuka → A tersedia, B ditolak. Respons dapat berisi data dan error sekaligus.
Fragment mengambil isi B Data B terbuka → ditolak oleh aturan objek yang sama.
Empat alias membaca A Empat panggilan resolver → QUERY_LIMIT sebelum resolver dipanggil.
Resolver gagal secara internal Detail path lab muncul → pesan umum INTERNAL_ERROR.

Script menyimpan 18 hasil untuk bad, fixed dan retest. Uji penolakan mencari penanda data B dalam keseluruhan respons; jangan hanya memeriksa apakah ada elemen errors.

Batasi pekerjaan, bukan hanya panjang teks query

OWASP membahas batas kedalaman, jumlah hasil, biaya query, waktu dan laju. Nilai batas perlu sesuai fitur dan kapasitas yang diuji; satu query dapat mengambil banyak data meskipun hanya satu permintaan HTTP.

Fixture menghitung node field pada AST, termasuk alias dan definisi fragment, lalu menolak hitungan di atas enam. Ini batas ilustrasi untuk schema kecil, bukan algoritma biaya siap produksi. Ia belum menghitung pengembangan fragment berulang, bobot relasi, jumlah baris atau biaya mutation. Menyalin angka enam ke produk tanpa pengukuran dapat memblokir pengguna sah atau melewatkan query mahal.

Pada produk, pilih mekanisme sesuai schema dan uji query normal sebagai kontrol positif. Tambahkan batas pagination, timeout dan laju operasi; rencanakan apa yang terjadi jika query berantai atau satu body berisi banyak operasi. Batch HTTP, cache, query cost berbobot dan load test belum dijalankan dalam lab ini.

Error dan introspection perlu keputusan tersendiri

Introspection memungkinkan pemeriksaan schema. Tentukan apakah API ditujukan bagi client internal atau pemakai eksternal, lalu dokumentasikan kebutuhannya. Mematikan introspection saja tidak memperbaiki izin objek.

Pesan error publik tidak perlu mengungkap path, stack trace atau rahasia. Simpan identitas kasus dan diagnosis yang diperlukan pada pencatatan internal dengan akses yang tepat. Lab hanya memperlihatkan penggantian pesan error; konfigurasi logging dan kebijakan introspection produk belum diuji.

Catat batas sebelum menyatakan hasil selesai

Pada ASVS 5.0.0, hubungkan pemeriksaan objek dengan v5.0.0-8.2.2 dan batas query dengan v5.0.0-4.3.1. Statusnya adalah kasus fixture memenuhi harapan, bukan seluruh persyaratan atau level ASVS lulus.

Isi matriks hak akses untuk baca, ubah, hapus dan relasi; simpan bukti di catatan verifikasi aplikasi. Mutation, izin field, introspection, autentikasi HTTP, federasi schema, injection dan kondisi beban produk tetap memerlukan pemeriksaan tersendiri.

Penjelasan keamanan diadaptasi dari OWASP dengan perubahan bahasa; bagian itu mengikuti CC BY-SA 4.0. Rujukan bahasa dan otorisasi berasal dari GraphQL Foundation. Schema, kasus dan hasil lab adalah contoh orisinal Kompli.

Unduh artikel (.md)

Sumber rujukan

  1. OWASP GraphQL Cheat Sheet ↗OWASP Foundation; akses, pembatasan query serta error · Access control, query limiting, cost/rate limits dan error.
  2. GraphQL Specification — September 2025 ↗GraphQL Foundation; spesifikasi bahasa dan execution, bukan jaminan izin aplikasi · Edisi September 2025: validation, execution, alias dan fragment.
  3. GraphQL — Authorization ↗GraphQL Foundation; penegakan izin pada lapisan logika bisnis · Izin pada lapisan logika bisnis, agar berlaku di semua jalur.
  4. OWASP ASVS 5.0.0 — persyaratan resmi dalam JSON ↗OWASP Foundation; file rilis resmi, bukan daftar persyaratan versi pengembangan · V8.2.2: akses objek; V4.3.1: pembatasan query; contoh bukan kesesuaian seluruh persyaratan.

Baca naskah lengkap untuk melihat syarat dan pengecualiannya. Sesuaikan dengan layanan dan bidang usaha Anda.

Perlu membahas kebutuhan tim Anda?

Ceritakan sistem yang dikelola dan kebutuhan pengamanan tim Anda.

Konsultasikan kebutuhan Anda