Saya harus merancang "widget", sebuah skrip yang akan dimasukkan oleh mitra di situs web mereka untuk menampilkan beberapa UI dan membuat panggilan ke API kami.
Pada dasarnya itu akan menampilkan data kami di situs-situs ini berdasarkan pada beberapa ID yang mereka berikan dalam panggilan API kami. Yang ingin kami hindari adalah seseorang yang menyalahgunakan API dan menggunakannya untuk mengikis keseluruhan katalog kami.
Setiap mitra yang menyematkan skrip kami akan diberikan kunci publik yang harus disediakan saat memanggil API. Suatu gagasan adalah meminta mereka untuk menambahkan kunci ini saat memuat skrip, misalnya:
<script src="//initrode.com/widget/loader.js?key=xxxx"></script>
Dengan cara itu permintaan untuk skrip dapat digunakan untuk mendaftarkan pasangan IP kunci / sumber, dan menjawab panggilan API berikutnya hanya jika pasangan kunci / IP cocok dengan yang terdaftar (dengan masa pakai terbatas, dan batas permintaan per hari).
Saya tidak yakin itu ide yang bagus karena itu jelas keamanan melalui kebingungan (seseorang yang memuat ulang skrip akan benar-benar memotongnya); tapi saya tidak melihat cara lain untuk membatasi akses. Saya tidak dapat memberikan kunci unik untuk setiap pengguna, hanya untuk mitra. Saya tidak dapat menggunakan sistem kunci pribadi karena semua kode akan tersedia untuk siapa saja. Ini pada dasarnya membatasi akses ke API publik, yaitu bertentangan dalam definisi.
Apa pendapat Anda tentang solusi ini, dan apa yang akan Anda lakukan dengan kendala-kendala ini?
sumber
Jawaban:
Anda memerlukan beberapa jenis perlindungan.
Pertama , Anda perlu mencegah kunci Situs A digunakan di Situs B.
Secara teori, jika kunci terikat ke domain, Anda tidak dapat bergantung pada
referer
tajuk, tetapi karena Anda klien sedang menyematkan skrip secara langsung, Anda dapat mengandalkannyadocument.location
di sisi klien. Mengirim lokasi itu (atau sebagiannya) ke server secara langsung tidak dapat diandalkan; tetapi Anda dapat menggunakannya untuk membuat kunci sesi:client_key
permintaan untuk pustaka API.session_key
menggunakanhash(document.location.host + session_salt)
.session_key
+client_key
untuk panggilan API.client_key
host dan "garam" di sesi, menghitung hash, dan membandingkan dengan yang disediakanclient_key
.Kedua , Anda perlu menghalangi Hacker Hank dari membuka konsol debug atau menggunakan klien yang dimodifikasi di Situs A untuk melakukan apa pun yang dia inginkan dengan API Anda.
Perhatikan bahwa sangat sulit, jika bukan tidak mungkin, untuk sepenuhnya mencegah Hacker Hank menyalahgunakan API. Tapi, Anda bisa membuatnya lebih sulit. Dan cara paling masuk akal untuk menghalangi Hank, yang saya tahu, adalah pembatasan suku bunga.
Ketiga , karena Anda mungkin sudah melakukan: mengenkripsi lalu lintas. Tentu, NSA akan melihatnya; tapi Hacker Hank kecil kemungkinannya.
sumber
Sepertinya yang Anda lakukan di sini menjadikan file javascript Anda menjadi sumber daya yang dilindungi. Dan menggabungkannya dengan semacam token generation pada saat yang bersamaan. Itu menarik.
Orang-orang keamanan saya bekerja dengan biasanya mengabaikan alamat IP karena IP spoofable. Tetapi jika Anda menggunakan batasan IP yang dikombinasikan dengan SSL, itu biasanya berhasil.
Tetapi Anda harus "memasukkan daftar putih" ke alamat IP, jika tidak, peretas apa saja bisa datang di pintu depan.
Saya skeptis, tetapi saya benar-benar berpikir skema Anda bekerja dengan sangat baik. Jika 1) file .js dan panggilan API berikutnya dibuat dengan TLS (yaitu SSL atau https), dan 2) IP dimasukkan dalam daftar putih. Lalu saya akan membuat pernyataan berani dan mengatakan saya pikir Anda akan lulus tinjauan keamanan, bahkan untuk interaksi PCI (kartu kredit).
IMHO ... Tetapi jika Anda hanya mencoba melindungi informasi hak milik perusahaan alih-alih kartu kredit (PCI) atau informasi pribadi / pribadi (PII), maka ini mungkin baik bahkan tanpa SSL, tergantung pada seberapa banyak Anda bersedia mengambil risiko mengekspos katalog Anda.
Atau begini: Dengan SSL, peretas yang berdedikasi tidak bisa mendapatkan katalog Anda. (Kecuali jika mereka melanggar SSL, tetapi kemudian mereka bisa merusak Amazon juga). Tanpa SSL, peretas yang berdedikasi dapat mengendus panggilan Anda, menipu IP dan menarik katalog Anda. Jadi itu semacam penilaian panggilan pada risiko.
Saya mencoba memikirkan cara untuk membuang daftar putih IP karena itu biasanya menyusahkan;) tanpa pergi ke OAuth sepenuhnya. Saya akan mie itu.
sumber