Bir API'nın yetkisiz kullanımını nasıl önleyebilirim?


10

Bir "widget", ortakları bazı UI görüntülemek ve API bizim çağrı yapmak için web sitelerine gömmek bir komut dosyası tasarlamak zorunda.

Temel olarak, bu sitelerdeki verilerimizi API çağrılarımızda sağladıkları bazı kimliklere dayanarak görüntüler. Bundan kaçınmak istediğimiz, API'yı kötüye kullanan ve kataloğumuzun tamamını kazımak için kullanan birisidir.

Betiğimizi yerleştiren her iş ortağına, API çağrılırken sağlanması gereken bir ortak anahtar verilir. Bir fikir, komut dosyasını yüklerken bu anahtarı eklemelerini istemek olabilir, örneğin:

<script src="//initrode.com/widget/loader.js?key=xxxx"></script>

Bu şekilde komut dosyası isteği anahtar / kaynak IP çiftini kaydetmek ve sonraki anahtar çağrılarını yalnızca anahtar / IP çifti kayıtlı bir eşleştirmeyle (sınırlı bir yaşam süresi ve günlük istek sayısı sınırlamasıyla) eşleştirmek için kullanılabilir.

Eminim iyi bir fikir çünkü açıkçası gizleme yoluyla güvenlik (komut dosyasını yeniden yükleyen biri tamamen atlayacak); ancak erişimi kısıtlamanın başka bir yolunu görmüyorum. Her kullanıcıya, yalnızca iş ortaklarına benzersiz bir anahtar veremiyorum. Tüm kod herkes tarafından kullanılabilir olacağı için özel anahtar sistemi kullanamıyorum. Temel olarak genel bir API'ya erişimi kısıtlar, yani tanımında çelişkilidir.

Bu çözüm hakkında ne düşünüyorsunuz ve bu kısıtlamalarla ne yapardınız?


Anahtarı dinamik yapabilir misiniz? Ortağın tanımlayıcısının MD5 karması artı UTC süresi en yakın 10 dakikaya yuvarlandı mı?
Dan Pichelman

2
Yapabilirim, ama bu senaryoda hesaplanacak ve herkesin çoğaltması için serbestçe kullanılabilir. Bunun güvenliği nasıl artırdığını görmüyorum.
Antoine

Ortağın sunucu tarafında hesaplamasını düşünüyordum. Bu bir seçenek değilse, o zaman tek gerçek seçiminizin bahsettiğiniz azaltmayı yapmak olduğundan şüpheleniyorum (sınırlı ömür, istek / gün limiti). Gördüğünüz IP'nin tek bir bilgisayarla eşleşmesi gerekmediğini unutmayın.
Dan Pichelman

Ben sunucu tarafı hesaplamak mümkün olup olmadığını iş ile kontrol etmek gerekir. Aksi halde korktuğum şey buydu, sadece çözüm kısıyor.
Antoine

Yanıtlar:


12

Birkaç koruma türüne ihtiyacınız var.

İlk olarak , A Sitesi anahtarının B Sitesinde kullanılmasını önlemeniz gerekir.

Anahtar bir etki bağlıysa Teoride, sen bağlı olamaz refererbaşlığında, ancak konum Müşterinin doğrudan bir komut dosyası gömme çünkü, sen yapabilirsiniz makul güvenmek document.locationistemci tarafında. Bu konumu (veya bir kısmını) doğrudan sunucuya göndermek güvenilmezdir; ancak bunu bir oturum anahtarı oluşturmak için kullanabilirsiniz:

  1. İstemci client_key, API kitaplığı için istekte bulunur.
  2. Sunucu, varsa API'ye erişimi olan ana bilgisayarı belirler.
  3. Sunucu bir oturum anahtarı için "tuz" seçer ve bunu kütüphaneye sahip istemciye gönderir.
  4. Müşteri bir hesaplar session_keykullanılarak hash(document.location.host + session_salt).
  5. İstemci bir API çağrısı için session_key+ kullanır client_key.
  6. Sunucu client_key, oturumun ana bilgisayarını ve "tuzunu" arayarak , karmayı hesaplayarak ve sağlananla karşılaştırarak çağrıyı doğrular client_key.

İkincisi , Hacker Hank'in hata ayıklama konsolunu açmasını veya Site A'da API'nizle ne isterse onu yapmak için değiştirilmiş bir istemci kullanmasını engellemeniz gerekir.

Bununla birlikte, Hacker Hank'in API'yı kötüye kullanmasını tamamen önlemenin imkansız olmasa bile çok zor olduğunu unutmayın . Ancak, bunu daha zor hale getirebilirsiniz. Hank'i engellemenin en makul yolu, bildiğim gibi, oran sınırlamasıdır.

  • İstek / saniye / oturum ve istek / saat / oturum sayısını sınırlayın. (Faaliyetteki ani artışlar makul olabilir, ancak tek bir müşteriden gelen ortalamanın üzerindeki trafikte sürdürülebilir değildir .)
  • Oturum sayısını / IP / saati sınırlayın.
  • Talep sayısını / IP / saati sınırlayın. Ani yükselmelere izin verin, ancak tek bir IP'den sürekli yoğun trafik gelmedi .

Üçüncüsü , muhtemelen zaten yaptığınız gibi: trafiği şifreleyin. Elbette, NSA bunu görecek; ama Hacker Hank daha az muhtemel.


0

Javascript dosyalarınızı korumalı kaynaklara dönüştürmek gibi bir şey yapıyorsunuz. Ve aynı zamanda bir çeşit token nesli ile bir araya getiriyor. İlginç.

Birlikte çalıştığım güvenlik görevlileri IP adreslerini elden kaçırdığı için genellikle IP adresini elden çıkarırlar. Ancak SSL ile birleştirilmiş bir IP kısıtlaması kullanıyorsanız, bu genellikle işe yarar.

Ancak IP adreslerini "beyaz listeye almanız" gerekir, aksi takdirde herhangi bir bilgisayar korsanı ön kapıya gelebilir.

Şüpheliydim, ama aslında planınızın oldukça iyi çalıştığını düşünüyorum. 1) .js dosyası ve sonraki API çağrıları TLS (SSL veya https gibi) ile yapılırsa ve 2) IP'ler beyaz listeye alınır. Sonra cesur bir açıklama yapacağım ve PCI (kredi kartı) etkileşimleri için bile bir güvenlik incelemesini geçeceğinizi düşünüyorum.

IMHO ... Ancak kredi kartı (PCI) veya kişisel / özel bilgi (PII) yerine şirkete ait bilgileri korumaya çalışıyorsanız, ne kadar olduğunuza bağlı olarak bu muhtemelen SSL olmadan bile iyidir Kataloğunuzu açığa çıkarmaya istekli.

Yoksa bu şekilde koydu: SSL ile özel bir korsan olamazdı senin katalog olsun. (SSL'yi bozmadıkları halde Amazon'u da kırabilirler). SSL olmadan, özel bir hacker çağrılarınızı koklayabilir, IP'yi taklit edebilir ve kataloğunuzu aşağı çekebilir. Yani bu bir nevi riske karşı bir çağrıdır.

Ben IP beyaz liste ile dağıtmak için bir yol düşünmeye çalışıyorum çünkü bu genellikle yönetmek için bir ağrı;) tam gelişmiş OAuth gitmeden. Bunun üzerine erişte yapacağım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.