JSON erişimi kısıtlamak nasıl?

7 Cevap php

Benim yeni oluşturulan json api verileri çeker bir web uygulaması var.

Benim statik HTML sayfaları dinamik statik HTML sayfasından JavaScript ile JSON API çağırır.

How do I restrict access to my JSON api so that only I (my website) can call from it?

Sorguya dayalı uygun JSON üretir http://example.com/json/?var1=x&var2=y&var3=z ...: Bu yardımcı durumda, benim api gibi bir şeydir.

Benim JSON sonuçlar üretmek için PHP kullanıyorum olabilir ... JSON API erişimi kısıtlayan gibi sadece $_SERVER['HTTP_REFERER'] API sadece benim etki ve bir uzak kullanıcı çağrılan ediliyor emin olmak için kontrol olarak ?

7 Cevap

Alanınıza erişimi kısıtlamak için olağan yöntem sonsuz çalıştığını şeyle içerik prepend olduğunu.

Örneğin:

while(1);{"json": "here"} // google uses this method
for (;;);{"json": "here"} // facebook uses this method

Eğer XMLHttpRequest veya etki sadece kısıtlı diğer herhangi bir yöntemle bu getir Yani, size sonsuz döngü ayrıştırmak gerektiğini biliyoruz. Ama bu komut düğümü üzerinden getirilen ise:

<script src="http://some.server/secret_api?..."></script>

Komut ilk açıklamada ötesinde olsun asla çünkü başarısız olur.

Ben JSON isteği from the user's browser yerine kendi sunucuda başlatıldığı kısmını yanlış anlama olabileceğini düşünüyorum. Statik bir HTML sayfası sonra geri dönüyor ve sayfadaki JavaScript kodu çalıştırır, kullanıcının tarayıcısına teslim edilir. Bu kod JSON veri elde etmek için geri sunucuya yeni bir bağlantı açar. Görüş PHP, senaryonun noktadan itibaren, JSON isteği yerde dış dünyada geliyor.

Yukarıdaki mekanizması göz önüne alındığında, HTML sayfanızın bağlamı dışında JSON API çağıran kimseyi önlemek için yapabileceğiniz pek bir şey yok.

Bence, sadece zor yapmak, erişimi kısıtlamak olamaz. Bu bilinmezlik tarafından biraz erişim-kısıtlaması gibi. yönlendirmeleri kolayca taklit edilebilir, ve hatta kısa ömürlü tuşu ile bir script sürekli anahtarını yenileyerek yanıtları alabilirsiniz.

bu yüzden, can ne yapacağız?

Burada zayıflık tespit:

http://www.example.com/json/getUserInfo.php?id=443

Saldırgan artık kolayca 1'den bir döngü içinde 1.000.000 tüm kullanıcı bilgileri talep edebilir. the weak point of auto_increment kimlikleri onların doğrusallık ve onlar tahmin etmek kolay olduğunuzu.

solution: veri için sayısal olmayan benzersiz tanımlayıcılarını kullanabilirsiniz.

http://www.example.com/json/getUserInfo.php?userid=XijjP4ow

bu üzerinde döngü olamaz. true, hala anahtarlarının her türlü anahtarları için html sayfaları ayrıştırmak, ancak saldırı bu tür farklı (ve daha kolay önlenebilir) sorundur.

downside: tabii ki anahtar-bağımlı olmayan sorgular, örneğin kısıtlamak için bu yöntemi kullanamazsınız arama.

API kullanan statik sayfalar genel Internet üzerinde olması gerekiyorsa, burada herhangi bir çözüm kusurlu olacak. Eğer müşterinin tarayıcı isteği göndermek ve onur sahip olması gerekiyor, çünkü herkes o URL oluşturan tam olarak nasıl olduğunu görmek için sadece yaklaşık için belki bu.

Sen API arkasında app http yönlendirme kontrol olabilir, ama birileri istiyorsa o sahte kolaydır.

Statik olması için sayfaları için bir gereklilik değil, size API tarafından oluşturulan ve geri bir parametre olarak birlikte geçti gets ilk sayfanın HTML yanıtta dahil bir kısa ömürlü "anahtar" var bir şeyler deneyebilirsiniz API. O ucunda sunucu vb onlar geçerli için ne kadar geçerli "tuşları", bir listesini tutmak olması gibi bu olsa API yükü eklersiniz

Yani, bir çok maliyetli değil ama kimse gerçekten istiyorsa almak zor olmayan bazı adımlar atabilirsiniz, ya da bir nebze daha zor bunu yapmak için daha fazla zaman geçirebilirsiniz, ama yapmak için mükemmel bir yol yoktur Bu API varsa yayım-erişilebilir olması.

Kısa cevap: Web sitenizin sayfalarına erişebilirsiniz herkes de API erişmek mümkün olacak.

Çeşitli şekillerde şifreleyerek daha zor API kullanarak yapmak için deneyebilirsiniz, ancak API çıkışını şifresini çözmek için JavaScript kodu eklemek gerekir, çünkü sadece bir silahlanma yarışı için kendinizi kurma için gidiyoruz diğer yollarla API kullanmak istiyorum karar herkes. Eğer kısa süreli tuşları, kararlı bir "saldırganın" kullansanız bile her zaman sadece sadece API kullanmadan önce (şimdiki tuşu ile birlikte) HTML kazıyın olabilir.

Yapmak istediğiniz tüm web sayfalarında API kullanarak diğer web sitelerini engellemek sonra ise Referans başlıklarını kullanabilirsiniz ancak tüm tarayıcılar Yönlendiricileri göndermek olduğunu akılda tutmak (ve bazı vekiller de onları soymak!) Olabilir. Bu tüm istekler bir yönlendirme eksik izin vermek isterdim, ve bu size sadece kısmi koruma verecek demektir. Ayrıca, ziyaretçileri kolayca taklit edilebilir, bu nedenle bazı diğer web sitesi really sizin API kullanmak istiyorsa onlar her zaman sadece bir tarayıcı parodi ve kendi sunucularından API erişebilirsiniz.

Sen, ya da bir çerez tabanlı kimlik doğrulamasını kullanabilirsiniz? Benim deneyim ASP.NET form kimlik dayanmaktadır, ancak aynı yaklaşım küçük bir kod ile PHP ile geçerli olmalıdır.

Kullanıcının web uygulaması aracılığıyla doğrulattığında temel fikir, bir şifreli değeri olan bir çerez istemci tarayıcısına döndürülür. Json api sonra arayanın kimliğini doğrulamak için bu çerez kullanmak istiyorsunuz.

Bu yaklaşım tabii ki çerezlerin kullanımını gerektirir, böylece ya da sizin için bir sorun olmayabilir.

Üzgünüz, web :-) hiçbir DRM yok

Sen güvenilir bir istemcisi olarak HTML tedavi edemez. Bu uygun gördükleri diğer insanların bilgisayarlarında yorumlanabilir bir düz metin senaryo. Eğer "kendi" javascript izin Ne olursa olsun kimseye izin yok. Hatta vahşi Greasemonkey ve kundakçı ile "sizin" değil ne kadar tanımlayabilirsiniz olamaz.

Hiçbiri JS istemci mevcut sanki sunucudaki tüm erişim kontrolü ve iş mantığı kısıtlamaları çoğaltmak gerekir.

Lütfen SSO'su hizmeti, akılda müşteri, değil iyi huylu javascript olarak hizmet tutulması wget tasarım, her kullanıcı erişimi olan URL'leri kısıtlamak.