Uzman bir kullanıcının ajax işlevlerimi çağırmasını nasıl önleyebilirim?


12

Bir dizi işlevi gerçekleştirmek için ajax çağrıları kullanan bir sitem var. Webbrowser bir komut dosyasına geri çağrı var - ajax.php. Verileri iletmek ve ajax betiğinin çağırabileceği komutları sınırlamak için post verileri kullanmamıza rağmen, kullanıcıların siteyi manipüle etmeye çalışmak için ajax çağrılarını aldatmasını önleyen hiçbir şey yok. Kullanıcıların çağrıları aldatmasını önlemenin bazı battaniye yolları var mı? Bir ajax aramasının aslında başka bir komut dosyasından veya siteden değil, web sitemden geldiğinden emin olmanın bir yolu var mı?

Ya da sadece php betiğindeki sınır koşullarını kontrol etmek ve kullanıcıların yapmasına izin verilmeyecek şeyleri taklit etmelerini önlemek, ancak izin verilen yerlerde taklit etmelerine izin vermek zorunda mıyım.


Ajax çağrıları tamamen doğrulanmamış mı? Her biri için oturum oluşturuyor musunuz? Kötüye kullanımın kalıpları var mı? Soruna özgü manipülasyonlar mı yoksa daha fazla siteye eklediği yük miktarı mı?
artlung

Daha ayrıntılı bilgi gönderebilir misiniz? AJAX çağrıları ne yapıyor? Ne manipüle ediyorlar? Komut dosyası AJAX dışında çağrılırsa ne gibi sorunlar oluşur?
DisgruntledGoat

Gerçekten belirli bir durum hakkında değil, birçok koşul için geçerli genel bir çözüm soruyorum. Böyle bir çözüm varsa, öyle görünmüyor.
Daniel Bingham

Yanıtlar:


12

Bunu güvenilir bir şekilde yapmanın herhangi bir yolu olduğunu düşünmüyorum, çünkü gönderebileceğiniz herhangi bir bilgi, kullanıcının ne kadar akıllı olduğuna bağlı olarak sahte olabilir.

Yalnızca sayfanızdan arama yapmayan basit bir kullanıcı bloğu istiyorsanız, yönlendireni kontrol edebilir, bir çerez kullanabilir veya arama sayfası tarafından gönderilen ve belirli bir süre sonra sona eren rastgele gizli bir alan ekleyebilirsiniz. Ancak, kullanıcı gerçekten belirlenirse, bunların taklit edilmesi kolaydır.


2
+1 .. tıpkı insanların tarayıcılarının görüntülediği her şeyin yerel kopyalarını kaydetmesini engellemek imkansız. Onlardan vazgeçip onlardan başka bir şeye geçip geçemeyeceğinizi görmek için bir yarışma.
Tim Post

6

Kısacası, hayır. Bir URL'ye GET veya POST yoluyla yapılan herhangi bir istek, herhangi bir yazılım kullanan herkes tarafından yapılabilir. Aslında, bir AJAX isteği URL'yi doğrudan yüklemekten gerçekten farklı değildir, ancak ikincisi döndürülen veriler tarayıcıda bir web sayfası gibi görüntülenir.

Javascript doğrulaması yapsanız da yapmasanız da, gönderilen verileri sunucuda her zaman doğrulamanızın nedeni budur.

Sunucu tarafı komut dosyasının ne yaptığını ve neyin yanlış gidebileceğini tam olarak açık değil, ancak kullanıcılar komut dosyanızı kötü verilerle çağırarak "siteyi manipüle edebilir" ise Yanlış Yapıyorsunuz demektir.

Muhtemelen en iyi çözüm, bir çeşit kimlik doğrulama sunmak olacaktır.


3

Yani ajax.php'yi sadece AJAX isteklerine yanıt vermekle sınırlamak mı istiyorsunuz?

Ben hiçbir php uzmanı değilim, ama verilen bir istek AJAX veya "düzenli" tarayıcı isteği değerini kontrol ederek geliyor olup olmadığını belirlemek mümkün gibi görünüyor $_SERVER['HTTP_X_REQUESTED_WITH'].

Kaynak


2
Kötüye kullanımın ajax kullanmadığını veya HTTP üstbilgisini taklit etmediğini varsayarsak iyi olur
Adam

1

Başka birinin işaret ettiği gibi ... ajax çağrıları sadece $ _GET veya $ _POST alıcılarıdır, bu yüzden yaklaşımım her zaman sadece herhangi bir eylem sayfası gibi davranır ve girdiyi filtreler / sanitize eder. Örneğin, bir ay gibi beklediğiniz şeyin küçük bir varyasyonu varsa ve her zaman "Jan, Feb, Mar ..." biçiminde olduğunu biliyorsanız, beklenen değerlerden oluşan bir dizi ayarlayabilir ve buna karşı filtre uygulayabilirsiniz. Eşleşmeyen her şeyi yakalayın ve isteğe bağlı olarak "Bzzt ... oynadığınız için teşekkürler ..."

Ajax betiğim bir form gönderme daha güvenli olması gereken bir örnek düşünemiyorum.

HTH


"Bzzt" için +1 - "Bzzt - oynadığınız için teşekkürler!" daha sonra kullanıcının makinesinde ayarlanan bir çerez tarafından uygulanan üç saatlik bir yasak ile birlikte yavaşça karartmanın yavaş yavaş solması (mesajı aldıklarından eminim)
danlefree

0

Çözümünüzün büyük bir kısmının belirli bir kullanıcı parmak izinden gelen trafiği sınırlandıracağını düşünüyorum . Belki bir IP adresi karması, User Agent dizesi ve gönderilen veriler.

Ayrıca, ajax'ı çağıran sayfanın geri döndürülen verilere daha yakın olarak bağlanması da yardımcı olabilir. Dolayısıyla, söz konusu sayfada, sayfa yüklendiğinde Xoturumlar için iyi olan bir oturum anahtarı gönderin , her ajax isteği için JavaScript'inizin bu anahtarı geri vermesi gerekir veya ajax bir hata döndürür. Sayfanız X+1ajax çağrılarına ulaştığında , kablodan yeni bir oturum anahtarı göndermeden önce (orijinal ajax'tan bant dışı) kullanıcıyı biraz işlem yapmaya (belki de captcha? Hatta a mousemoveveya tapolay gibi bir şey) zorlayın ve yeniden başlatın süreç.

Düşündüğüm gibi, belki de sorunun bir kısmı gönderilen parametrelerin gevşek onaylanması olabilir. İnsanlar gönderilen parametrelerle oynayabilir ve geçerli verileri geri alabilirlerse bunu zorlaştırırlar. Bunun nasıl yapılacağı müşteri tarafından ne tür değerlerin gönderildiğine ve kötü bir oyuncunun kötü değerler göndererek ne tür bir yaramazlık yapabileceğine bağlıdır.

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.