English | 繁中版 | 简中版 | العربية | Azərbaycan | Български | বাংলা | Català | Čeština | Deutsch | Ελληνικά | Español | فارسی | Français | हिंदी | Italiano | 日本語 | 한국어 | ພາສາລາວ | Македонски | മലയാളം | Монгол | Nederlands | Polski | Português (Brasil) | Русский | ไทย | Türkçe | Українська | Tiếng Việt
Checklist penanggulangan keamanan yang paling penting ketika merancang, menguji, dan melepaskan API ke khalayak
- Jangan gunakan
Basic Auth
. Gunakan autentikasi baku (Contoh: JWT, Oauth). - Gunakan mekanisme baku untuk
autentikasi
,pembuatan token
, danpenyimpanan kata sandi
. - Gunakan maksimal percobaan berulang dan fitur penjara pada Login.
- Gunakan enkripsi untuk seluruh data sensitif.
- Gunakan kunci acak yang rumit (
JWT Secret
) untuk membuat proses pemecahan token secara paksa menjadi sangat susah. - Jangan gunakan algoritma yang berasal dari muatan yang dikirim oleh pengguna. Paksa penggunaan algoritma di sisi peladen (
HS256
atauRS256
). - Gunakan masa tenggat token (
TTL
,RTTL
) yang sesingkat mungkin. - Jangan simpan data sensitif pada muatan JWT karena muatan JWT dapat diterjemahkan dengan mudah.
- Hindari menyimpan terlalu banyak data. JWT biasanya dibagikan di header dan mereka memiliki batas ukuran.
- Batasi permintaan (throttling) di sisi peladen untuk menghindari serangan yang dapat melumpukan sistem (Contoh: DDoS, serangan paksa).
- Gunakan HTTPS di sisi peladen untuk menghindari serangan pencegatan / MItM (Man In The Middle Attack).
- Gunakan tajuk
HSTS
pada SSL untuk mencegah serangan SSL Strip. - Matikan daftar direktori.
- Untuk API pribadi, izinkan akses hanya dari IP/host yang masuk daftar putih.
- Selalu validasi
redirect_uri
di sisi peladen sehingga hanya URL-URL yang ada di dalam daftar putih yang boleh digunakan. - Selalu coba untuk mempertukarkan kode bukan token (jangan ijinkan
response_type=token
). - Gunakan parameter
state
dengan campuran nilai acak (random hash) untuk mencegah CSRF pada proses autentikasi. - Tetapkan cakupan baku dan validasi parameter cakupan untuk setiap aplikasi.
- Gunakan metode HTTP yang sesuai dengan operasi yang digunakan,
GET untuk membaca catatan
,POST untuk membuat catatan baru
,PUT/PATCH untuk mengganti secara keseluruhan/mengubah sebagian catatan
,DELETE untuk menghapus catatan
dan tanggapan405 Method Not Allowed
jika metode permintaan tidak dikenali pada sumber daya. - Validasi
content-type
pada tajuk Accept pada permintaan (Negosiasi konten) sehingga hanya mengijinkan format yang dikenali (Contoh:application/xml
,application/json
, dan lain sebagainya). Berikan tanggapan406 Not Acceptable
jika nilai tajuk Accept tidak dikenali. - Validasi
content-type
dari data yang dipos oleh pengguna (Contoh:application/x-www-form-urlencoded
,multipart/form-data
,application/json
, dan lain sebagainya). - Validasi masukan dari pengguna untuk menghindari kerentanan umum (Contoh:
XSS
,SQL-Injection
,Remote Code Execution
, dan lain sebagainya). - Jangan gunakan data sensitif seperti
kredensial
,kata sandi
,token keamanan
, ataukunci API
pada URL. Gunakan tajuk Authorization baku. - Gunakan hanya enkripsi sisi server.
- Gunakan layanan pintu gerbang API (API Gateway) untuk memungkinan singgahan, pembatasan laju, pendeteksian lalu lintas tinggi, dan penyebaran sumber daya API secara dinamis.
- Cek apakah seluruh titik akhir terlindungi oleh autentikasi untuk menghindari proses autentikasi yang rusak.
- Sumber daya ID kepunyaan pengguna sebaiknya dihindari. Lebih baik menggunakan
/me/orders
daripada/user/654321/orders
. - Jangan gunakan ID yang bertambah secara otomatis. Sebaiknya gunakan
UUID
. - Jika hendak menguraikan berkas XML, pastikan penguraian entitas tidak diaktikan untuk menghindari serangan
XXE
(XML External Entity). - Jika hendak menguraikan berkas XML, pastikan perluasan entitas tidak diaktifkan untuk menghindari
Billion Laughs/XML bomb
melalui serangan perluasan entitas eksponensial. - Gunakan CDN untuk unggah berkas.
- Jika berhubungan dengan jumlah data yang sangat besar, gunakan Pekerja dan Antrian untuk memproses sebanyak mungkin di balik layar dan kembalikan tanggapan cepat untuk menghindari pemblokiran HTTP.
- Jangan lupa untuk mematikan mode DEBUG.
- Gunakan stack yang tidak dapat dieksekusi jika tersedia.
- Kirim tajuk
X-Content-Type-Options: nosniff
. - Kirim tajuk
X-Frame-Options: deny
. - Kirim tajuk
Content-Security-Policy: default-src 'none'
. - Hapus tajuk sidik jari -
X-Powered-By
,Server
,X-AspNet-Version
dan lain sebagainya. - Paksa
content-type
pada tanggapan. Jika mengambalikanapplication/json
maka tajukcontent-type
adalahapplication/json
. - Jangan kembalikan data sensitif seperti
kredensial
,kata sandi
, dantoken keamanan
. - Kembalikan kode status yang layak sesuai dengan operasi yang diselesaikan (Contoh:
200 OK
,400 Bad Request
,401 Unauthorized
,405 Method Not Allowed
, dan lain sebagainya).
- Audit rancangan dan pelaksanaan dengan pengujian unit/integrasi.
- Gunakan proses ulasan kode dan kesampingkan persetujuan sendiri.
- Pastikan seluruh komponen layanan dipindai secara statis menggunakan anti virus sebelum didorong ke lingkungan produksi, termasuk pustaka-pustaka milik vendor dan ketergantungan lainnya.
- Jalankan uji keamanan (analisis statis/dinamis) secara terus-menerus pada kode Anda.
- Memeriksa dependensi Anda (perangkat lunak dan OS) untuk mengetahui kerentanannya.
- Rancang solusi kembali ke versi sebelumnya pada proses penyebaran.
- Gunakan login terpusat untuk semua layanan dan komponen.
- Gunakan agen untuk memantau semua lalu lintas, kesalahan, permintaan, dan respons.
- Gunakan peringatan untuk SMS, Slack, Email, Telegram, Kibana, Cloudwatch, dll.
- Pastikan Anda tidak mencatat data apapun yang sensitif, seperti kartu kredit, kata sandi, PIN, dll.
- Gunakan sistem IDS dan/atau IPS untuk memantau permintaan dan instans API Anda.
- yosriady/api-development-tools - Kumpulan sumber yang berguna untuk membangun API RESTful HTTP+JSON.
Silahkan berkontribusi dengan cara menduplikasi repositori ini, lakukan perubahan, dan kirimkan PR. Jika ada pertanyaan silakan kirim email ke [email protected]
.