Hızla sınırlı kendi API'mizin test sürümünü kullanıyor


117

Genel bakış:

Şirketim, hız sınırlamalı bir API geliştirdi. Amacımız iki yönlü:

  • C: Ürünümüzün etrafında güçlü bir geliştirici ekosistemi oluşturun.
  • B: API'mizin gücünü kendi uygulamamızı çalıştırmak için kullanarak gösterin.

Açıklama: Neden oran sınırı var?

API'mizi sınırlandırıyoruz çünkü ürünümüze ek olarak satıyoruz. API'mize anonim erişimin saat başına API çağrıları için çok düşük bir eşiği varken, ücretli müşterilerimize saatte 1000 çağrı veya daha fazlasına izin verilir.

Sorun:

Hızla sınırlı API'miz geliştirici eko sistemi için harikadır, ancak test sürümünü kullanabilmemiz için aynı hız sınırlamasıyla sınırlandırılmasına izin veremeyiz. API'mızın ön ucu tamamen JavaScript'tir ve API'ye doğrudan Ajax çağrıları yapar.

Yani soru şu:

Hız sınırlamasının kaldırılabilmesi için bir api'yi nasıl güvence altına alırsınız? Bu tür hız sınırlamalarını kaldırma sürecinde kolayca sahtekarlık yapılamaz?

Keşfedilen Çözümler (ve neden işe yaramadılar)

  1. Yönlendireni ana bilgisayar başlığına göre doğrulayın. - Hatalı çünkü yönlendiren kolayca sahtedir.

  2. İstek ve paylaşılan sırrı temel alan bir imza oluşturmak için bir HMAC kullanın , ardından isteği sunucuda doğrulayın. - Kusurlu çünkü sır ve algoritma, ön uç JavaScript'e bakılarak kolayca belirlenebiliyordu.

  3. İsteği proxy'ye bağlayın ve isteği proxy'de imzalayın - Proxy'nin kendisi API'yi açığa çıkardığı için hala kusurlu.

Soru:

Alternatif çözümler sunmak için Stack Overflow'daki parlak beyinlere bakıyorum. Bu sorunu nasıl çözersiniz?


13
Yapamazsın. Hız sınırlamasıyla sınırlandırılmasını istemediğiniz API'yi kendi kullanımınız yalnızca genel web sayfalarından geliyorsa, bu genel web sayfalarından güvenli bir şey yapamazsınız çünkü zaten bildiğiniz gibi genel web sayfalarında sır yoktur. Öyleyse, web sayfalarınızda neler yapabileceğiniz, başkaları da yapabilir.
jfriend00

28
Test sürümü kullanımınızda gerçekten çözmeniz gereken bir hız sınırlayıcı sorununuz olduğundan emin misiniz? Sitenizi ve web sayfalarınızı kullanan her kullanıcı, oran sınırlama kodunuzdan tamamen farklı bir kullanıcı olarak görünmelidir. Bu nedenle, her web sayfasının kendi başına normal hız sınırlama kurallarına göre çalıştığından emin olun ve iyi olmalısınız. Oran sınırlamanızın müşteri başına olduğunu varsayarsak, bir kullanıcının başka herhangi bir kullanıcıyla ilgisi olmayacaktır.
jfriend00

6
Neden kullanıcı başına, rol / izin başına veya uygulama kapsamında hız sınırlama ve azaltma sağlayan bir API Yönetimi çözümünü düşünmüyorsunuz? Eg wso2 api manger
MiddlewareManiac


28
Test sürümünüz, genel API'nizle ilgili önemli bir sorun keşfetti (bu, hız sınırının çok düşük olmasıdır) ve bunu düzeltmek yerine, bunun üstesinden gelmeye çalışıyorsunuz. Bulduğunuz sorunları görmezden gelecekseniz neden test sürümü?
user253751

Yanıtlar:


93

Kendi JavaScript istemciniz API'ye doğrudan eriştiğinden, aynı API anahtarını kullanmak da dahil olmak üzere herkes ne yaptığına bakabilir ve onu taklit edebilir. Kodunuzu şaşırtarak veya çeşitli engeller koyarak bunu daha zor hale getirmeye çalışabilirsiniz, ancak siz ve sınırlamaya çalıştığınız kişi temelde aynı erişime sahip olursunuz. Ayrıcalıklarda bir fark yaratmaya çalışmak yerine, resmi olmayan istemcinin kendi kapsamındaki tüm erişimi kullanmasının tamamıyla tamam olduğu bir sistem kurmanız gerekir, ancak sistem, tüm istemcilerde resmi kullanım olacak şekilde düzenlenmiştir. daha büyüktür.

Bu genellikle tüm uygulama için bir belirteç yerine kullanıcı başına erişim belirteçleriyle yapılır. Her bir belirtecin sınırı, API'nizin tipik kullanımı için yeterli, ancak onu kötüye kullanmaya çalışan biri için kısıtlayıcı olmalıdır. Örneğin, dakikada 100 çağrı, tipik taramayı desteklemek için fazlasıyla yeterli olabilir, ancak sizi kazımak istersem, bunu bu bütçeyle etkili bir şekilde yapamam.

Her zaman bir silahlanma yarışı olacak - çok sayıda bot kullanıcı hesabı oluşturarak sınırı aşabilirim. Yine de, kayıt akışınıza bir captcha eklerseniz, gerçek insana küçük bir maliyetle bu oldukça çözülmüş bir sorundur. Bu senaryolara girdiğinizde, her şey sadece kolaylık ve kısıtlama arasında bir değiş tokuştur. Hiçbir zaman tamamen kurşun geçirmez bir şey bulamayacaksınız, bu yüzden onu yeterince iyi yapmaya odaklanın ve deliklerin nerede olduğunu öğrenmek için birinin sizi sömürmesini bekleyin.


8
Bunu en iyi cevap olarak kabul ediyorum. Gitmeye karar verdiğimiz rota, daha düşük bir sona erme tarihine sahip JWT tokenları kullanmak ve bu çağrıların oran sınırını artırmaktır. Arka uca daha yüksek hız sınırını bildirmek için jetondaki bazı ek bilgileri kodlayacağız. Bu belirteçler arka uçta güvenli bir şekilde imzalandığından, sahtekarlıkla ilgili herhangi bir sorun olmamalıdır. Birisi yine de belirteci kullanabilir, ancak birkaç gün sonra süresi dolar ve bu nedenle herhangi bir tür botu sürdürmek daha zor olurdu.
Jason Waldrip

33

Bu size bir soruna neden oluyorsa, geliştiricilerden oluşan varsayılan ekosisteminizde bir soruna neden olur (örneğin, alternatif bir kullanıcı arayüzü geliştirmeye çalıştıklarında). Gerçekten kendi köpek mamanızı yiyorsanız, API'yi (ve oranı sınırlandırmayı) uygulamanız için çalıştırın. İşte bazı öneriler:

  • Sınırı IP adresine göre derecelendirmeyin. Daha ziyade, kullanıcıyla ilişkili bir şey tarafından hız sınırı, örneğin kullanıcı kimliği. Kimlik doğrulama aşamasında hız sınırını uygulayın.

  • API'nizi, kullanıcıların sürekli olarak çağırmasına gerek kalmayacak şekilde tasarlayın (örneğin, her seferinde bir öğe döndüren yinelenen bir çağrı yerine birçok sonuç döndüren bir liste çağrısı verin)

  • Web uygulamanızı geliştirici ekosisteminizin sahip olmasını beklediğiniz aynı kısıtlamalarla tasarlayın, yani makul kısma oranları dahilinde tasarlayabildiğinizden emin olun.

  • Arka ucunuzun ölçeklenebilir olduğundan (yatay olarak tercihen) emin olun, böylece çok düşük seviyelerde azaltma uygulamanıza gerek kalmaz ki bu aslında bir kullanıcı arayüzünde bir soruna neden olur.

  • Yavaşlamanızın patlamalarla baş edebildiğinden ve uzun vadeli kötüye kullanımı sınırladığından emin olun.

  • Azaltmanızın, kaldırmak istediğiniz kötüye kullanım için özel olarak hazırlanmış mantıklı eylemler gerçekleştirdiğinden emin olun. Örneğin, bağlantıyı reddetmek yerine, hafif istismarcıları sıraya koymayı veya geciktirmeyi düşünün. Çoğu web ön ucu, aynı anda yalnızca dört bağlantı açar. Beşinciyi açma girişimini geciktirirseniz, yalnızca web istemcisi ile aynı anda (iki web istemcisi) bir CLI kullandıkları duruma gelirsiniz. Eğer n'inci API çağrısını başarısız olmak yerine bir boşluk olmadan geciktirirseniz, son kullanıcı işlerin bozulmak yerine yavaşladığını görecektir. Bunu yalnızca N API çağrılarını aynı anda sıraya koymakla birleştirirseniz, yalnızca çok sayıda API çağrısını paralelleştiren kişilere ulaşırsınız, bu muhtemelen istediğiniz davranış değildir - örneğin 100 eşzamanlı API çağrısı, bu durumda bir saatlik boşluk normalde çok uzaktır bir saat içinde 100 sıralı API çağrısından daha kötü.

Bu sorunuzu cevaplamadı mı? Peki, gerçekten istediğiniz şeyi yapmanız gerekiyorsa , kimlik doğrulama aşamasında hız sınırı ve kullanıcınızın dahil olduğu gruba göre farklı bir hız sınırı uygulayın. Bir dizi kimlik bilgisi kullanıyorsanız (geliştiricileriniz ve QA ekibiniz tarafından kullanılır), daha yüksek bir oran sınırı elde edersiniz. Ancak, geliştirme ve QA ekibinizin görmediği sorunları görmenin sizi neden kaçınılmaz olarak ekosisteminize yönlendireceğini hemen anlayabilirsiniz.


11

Ürününüzü satın alın. Kendinizin ücretli bir müşterisi olun.

"API'mize anonim erişimin saat başına API çağrıları için çok düşük bir eşiği varken, ücretli müşterilerimize saatte 1000 çağrı veya daha fazlasına izin verilmektedir."

Bu aynı zamanda sistemin müşterinin bakış açısından test edilmesine yardımcı olur.


1
Açık cevap. Burada hile yapmak veya numara yapmak yok!
wizzwizz4

9

Ne yazık ki bunun için mükemmel bir çözüm yok.

Genel yaklaşım tipik olarak bir sahte biristemcilerin kendilerini tanıtma yolu (örneğin, bir tanımlayıcı, sürüm ve API anahtarı - örneğin), istemcilerin kendileri hakkında erişimi sınırlamak için kullanılabilecek bilgileri kaydetmeleri için (örneğin, istemci belirli bir IP adresi aralığında bir sunucu, bu nedenle yalnızca bu aralıktaki arayanlara izin verin; örneğin, istemci JavaScript'tir, ancak yalnızca belirli bir tarayıcı kategorisine teslim edilir, bu nedenle yalnızca belirli kullanıcı aracısı dizelerini belirten HTTP isteklerine erişime izin verin; vb.) ve ardından makine öğrenimi / kalıbı kullanın Sahte bir istemci olabilecek anormal kullanımı tespit etmek ve ardından bu sahte istemcilerden gelen trafiği reddetmek için tanıma (veya istemcilerle bu kullanımların gerçekten yasal istemciden gelmediğini onaylayın, sahte kimlik bilgilerini değiştirin ve ardından eskisini kullanarak daha fazla trafiğe izin vermeyin sahte kimlik bilgileri).

Birden çok anahtar katmanı kullanarak yanıltmayı biraz daha zor hale getirebilirsiniz. Örneğin, istemci (örneğin, kullanıcı aracısı) hakkındaki bilgileri kaydeden bir API çağrısı yapmak için bir sunucuda yaşayan (ve yalnızca sınırlı bir IP adresi aralığında kullanılabilen) daha uzun ömürlü bir kimlik bilgisi verirsiniz ve İstemci tarafı API istekleri için istemcide kullanılmak üzere JavaScript'te sendikasyona dahil edilen daha kısa ömürlü bir istemci tarafı anahtarı döndürür. Bu da kusurludur (bir spoofer, kimlik bilgilerini almak için aynı sunucu çağrısını verebilir), ancak döndürülen API anahtarının karmaşık hale getirilmiş (ve sık sık değişen) JavaScript veya HTML'ye dahil edilmesi daha zor olacaktır (bu da işi zorlaştıracaktır. yanıttan güvenilir bir şekilde çıkarmak için). Bu aynı zamanda sahtekarlığı daha kolay tespit etmek için bir yol sağlar; istemci tarafı anahtarı artık belirli bir istemciye bağlıdır (ör.


8

Söz konusu uygulamanın herkese açık olması gerektiğini varsayarsak, fazla seçeneğiniz yoktur:

API'nizin gücünü göstermenin başka bir yolunu seçin. Örneğin, böyle bir uygulama yazın ve kaynağını paylaşın, ancak aslında o kodu çalıştırmayın. Bununla birlikte, iyi bir şekilde belgelendiğinden emin olun, böylece herkes onu dağıtabilir ve çalıştığını görebilir (kısıtlamaya tabidir).

İstemci tarafı API isteklerinden kaçınmak ve daha fazla sunucu tarafından oluşturulmuş olması için çalıştırdığınız uygulamanın yeniden düzenlenmesi gerekir. API'nizin test sürümünü yine de yapabilirsiniz, ancak açık bir şekilde değil — sunucu tarafından kısıtlamasız API'ye güvenli isteklerde bulunun.

Uygulamanızın çalışmasına izin vermek için hız sınırlamasını ayarlayın ve yükü işlemek için performans optimizasyonuna yatırım yapın.

Ve evet, ilk etapta çekirdek API'yi yavaşlatın ve onu özel bir ağ içinde tutun. Herkes tarafından erişilebilen ayrı bir katmanda kısın.


4

Ayrı bir kullanıcı arayüzü ve kısma içermeyen API örneği oluşturabilir ve ardından kuruluşunuzdan gelen IP adreslerine erişimi kısıtlayabilir misiniz?

Örneğin, kurumsal güvenlik duvarınızın arkasındaki her şeyi dağıtın ve örnekler arasında veri paylaşmanız gerekiyorsa uygulamayı herkese açık örnekle aynı veritabanına ekleyin.


4

Belirli bir IP adresine / kullanıcıya bağlı ve sınırlı yaşam süresi olan benzersiz bir oturum kimliği oluşturmayı deneyebilirsiniz. Bir kullanıcı uygulamanızın ön uç JavaScript kodunu indirdiğinde, oluşturulan oturum kimliğini JavaScript kaynak koduna enjekte edin. Oturum kimliği, API'nize yapılan her isteğe eklenecek ve oran sınırı kaldırılacaktır.

Kimlik sahtekarlık için basitçe kopyalanamaz çünkü yalnızca tek bir IP adresi, kullanıcı ve sınırlı bir süre için geçerlidir. Bu nedenle, bir rakibin sayfanızı çağırması ve JavaScript kaynağınızdaki anahtarı filtrelemesi veya yeni bir kullanıcı onu her kullanmak istediğinde Ajax isteğini durdurması gerekir.

Başka seçenek:

Kendi uygulamanız için bir proxy kurun ve gizlemeyi kullanın. Proxy'ye Ajax istekleri gerçek API çağrılarından farklı isimler kullanır ve proxy bunları geri çevirir. Böylece uygulamanız getDocumentgerçek API'nizi çağırmayacak, ancakgetFELSUFDSKJE proxy'nizi . Proxy, bu aramayı getDocument'e geri çevirecek ve hızı sınırlı gerçek API'ye iletecektir.

Gerçek API'niz, proxy'nin isteklerini sınırlamaz.

Ve diğer insanların kendi uygulamaları için vekilinizi kullanmaması için, şaşırtma şemasını günlük olarak değiştirirsiniz. Gizlenmiş çağrı adları, JavaScript kaynak kodunuzda otomatik olarak oluşturulabilir ve proxy'de yapılandırılabilir.

Bunu kullanmak isteyen bir müşterinin, proxy'nizi kullanmak için değişen gizlemenize de ayak uydurması gerekir. Ve yine de günlük kaydı için yönlendirme başlıklarını ve benzerlerini kullanabilirsiniz, böylece proxy'nizi kullanan kişileri bulabilirsiniz. Veya gizleme düzenini değiştirirken onları yakalayın.


3
  • Beyaz listeye kaynak IP adresleri
  • Bir VPN kullanın , VPN üyelerini beyaz listeye ekleyin
  • Proxy çözümü veya HTTP üstbilgileri ekleyen tarayıcı eklentisi, proxy'yi güvenli hale getirebiliyorsanız ve trafiği koklayan MITM saldırıları konusunda endişelenmiyorsanız iyi olacaktır.
  • Sırları içeren herhangi bir çözüm, sırları günlük olarak değiştirerek sızıntıların etkisini azaltabilir.

Bu çözümler, bir ön uç web istemcisi için geçerli değildir. API'ye erişim arka uçta ise mükemmeldir.
Jason Waldrip

@jason bunların tümü bir ön
uca

2

Birden fazla hesap oluşturun ve her istekte rastgele birini seçin veya hangisini kullandığınızı yaklaşık saatte bir değiştirin. Bu şekilde yükü nhesaplara dağıtabilir ve sizen daha yüksek limitler .

Müşterilere izin verilmiyorsa, bunu yapan başka kullanıcılar bulmaya çalışıyorsanız, yanlışlıkla kendinizi kapatmaya dikkat edin.

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.