Saya sedang mengembangkan aplikasi web tenang yang menggunakan beberapa kerangka kerja web populer di backend, katakanlah (rails, sinatra, flask, express.js). Idealnya, saya ingin mengembangkan sisi klien dengan Backbone.js. Bagaimana cara mengizinkan hanya sisi klien javascript saya yang berinteraksi dengan panggilan API tersebut? Saya tidak ingin panggilan API tersebut menjadi publik dan dipanggil dengan curl
atau hanya dengan memasukkan tautan di browser.
92
Jawaban:
Sebagai prinsip pertama, jika API Anda dikonsumsi oleh klien JS Anda, Anda harus berasumsi, bahwa itu publik: Debugger JS sederhana menempatkan penyerang ke posisi, di mana dia dapat mengirim permintaan identik byte-untuk-byte dari alat pilihannya.
Yang mengatakan, jika saya membaca pertanyaan Anda dengan benar, ini bukan, yang ingin Anda hindari: Apa yang sebenarnya tidak Anda inginkan terjadi adalah, bahwa API Anda dikonsumsi (secara teratur) tanpa melibatkan klien JS Anda. Berikut adalah beberapa ide tentang bagaimana jika tidak menegakkan, maka setidaknya mendorong penggunaan klien Anda:
Saya yakin, API Anda memiliki semacam bidang otentikasi (mis. Hash dihitung pada klien). Jika tidak, lihat pertanyaan SO ini . Pastikan Anda menggunakan salt (atau bahkan kunci API) yang diberikan ke klien JS Anda pada basis sesi (aot hardcode). Dengan cara ini, konsumen API Anda yang tidak sah dipaksa untuk bekerja lebih banyak.
Saat memuat klien JS, ingat beberapa header HTTP (yang dipikirkan oleh agen pengguna) dan alamat IP, lalu minta autentikasi ulang jika berubah, menggunakan daftar hitam untuk tersangka biasa. Hal ini memaksa penyerang untuk melakukan pekerjaan rumahnya dengan lebih teliti lagi.
Di sisi server, ingat beberapa panggilan API terakhir, dan sebelum mengizinkan panggilan API lainnya, periksa apakah logika bisnis memungkinkan untuk yang baru sekarang: Ini menyangkal kemampuan penyerang untuk memusatkan banyak sesinya ke dalam satu sesi dengan server Anda: Dalam kombinasi dengan tindakan lain, ini akan membuat pelaku kekerasan mudah terdeteksi.
Saya mungkin tidak mengatakannya dengan kejelasan yang diperlukan: Saya menganggap tidak mungkin membuat mustahil bagi seorang pelaku untuk menggunakan layanan Anda, tetapi Anda dapat membuatnya begitu sulit, mungkin tidak sepadan dengan kerumitannya.
sumber
Anda harus menerapkan semacam sistem otentikasi. Salah satu cara yang baik untuk menanganinya adalah dengan menentukan beberapa variabel header yang diharapkan. Misalnya, Anda dapat memiliki panggilan API auth / login yang mengembalikan token sesi. Panggilan berikutnya ke API Anda akan mengharapkan token sesi disetel dalam variabel header HTTP dengan nama spesifik seperti 'your-api-token'.
Sebagai alternatif, banyak sistem membuat token atau kunci akses yang diharapkan (seperti youtube, facebook atau twitter) menggunakan semacam sistem akun api. Dalam kasus tersebut, klien Anda harus menyimpannya dengan cara tertentu di klien.
Maka itu hanya masalah menambahkan pemeriksaan untuk sesi ke dalam kerangka REST Anda dan melemparkan pengecualian. Jika memungkinkan, kode status (menjadi tenang) akan menjadi kesalahan 401.
sumber
Ada standar terbuka yang sekarang disebut "JSON Web Token",
lihat https://jwt.io/ & https://en.wikipedia.org/wiki/JSON_Web_Token
sumber
Permisi @MarkAmery dan Eugene, tapi itu tidak benar.
Aplikasi js + html (klien) Anda yang berjalan di browser DAPAT disiapkan untuk mengecualikan panggilan langsung yang tidak sah ke API sebagai berikut:
Selama otentikasi, sebuah "token" dikembalikan.
Setelah otentikasi, hanya panggilan API dengan otentikasi "token" yang akan diterima.
Tentu saja pada tahap ini hanya pengguna resmi yang memiliki kata sandi yang dapat mengakses API, meskipun jika mereka adalah pemrogram yang men-debug aplikasi, mereka dapat mengaksesnya secara langsung untuk tujuan pengujian.
Sekarang untuk menggunakan API Anda, mereka harus mengunduh klien terlebih dahulu dan benar-benar menjalankannya di browser. Hanya setelah berhasil menerima panggilan balik, dan kemudian entri pengguna dalam waktu singkat, API akan menerima panggilan.
Jadi Anda tidak perlu khawatir bahwa ini mungkin pengguna yang tidak sah tanpa kredensial.
(Judul pertanyaan, 'Bagaimana cara mengamankan panggilan REST API', dan dari sebagian besar yang Anda katakan, itu adalah perhatian utama Anda, dan bukan pertanyaan literal tentang BAGAIMANA API Anda dipanggil, melainkan OLEH SIAPA, yang benar? )
sumber
Tetapkan var SESSION di server ketika klien pertama kali memuat Anda
index.html
(ataubackbone.js
dll.)Periksa var ini di sisi server pada setiap panggilan API.
PS ini bukan solusi "keamanan" !!! Ini hanya untuk meringankan beban di server Anda sehingga orang tidak menyalahgunakannya atau "menautkan" API Anda dari situs web dan aplikasi lain.
sumber
Inilah yang saya lakukan:
Amankan API dengan HTTP Header dengan panggilan seperti X-APITOKEN:
Gunakan variabel sesi di PHP. Memiliki sistem login dan menyimpan token pengguna di variabel sesi.
Panggil kode JS dengan Ajax ke PHP dan gunakan variabel sesi dengan curl untuk memanggil API. Dengan begitu, jika variabel sesi tidak disetel, itu tidak akan memanggil dan kode PHP berisi Token Akses ke API.
sumber