PHP script çalıştırılmasına Geciktirme

4 Cevap php

Çok hızlı php komut dosyalarını yürütme vb botlar durdurmak için en iyi yolu, kötü niyetli kullanıcılar, nedir? Ben sadece (istenen kod yürütür hemen önce) bir süre için "hiçbir şey" yapmak için usleep() veya sleep() işlevlerini kullanırsanız o ok, ya da o aptal düz ve daha vardır Bunun için yollar?

Örnek:

function login() {
 //enter login code here
}

function logout() {
 //enter logout code here
}

Ben sadece koyarsanız, diyelim ki, usleep(3000000) giriş ve çıkış kodları önce olduğunu tamam, ya ben ne elde etmek istediğinizi elde daha iyi, daha akıllı yolu vardır?

edit: Aşağıdaki önerileri dayanarak yapar, sonra da usleep veya sleep sadece işlemci geçerli kullanıcı tarafından yürütülen mevcut script ayrılmasına neden, ya da bunu yapar o tüm hizmet ayrılmasına neden? bir kullanıcı + komut çağırır varsa yani sleep / usleep, tüm eşzamanlı kullanıcılar + betikleri de gecikecek?

4 Cevap

Çoğu web sunucuları (örneğin Apache) çalışmak yolu işçi iş parçacığı bir koleksiyon muhafaza etmektir. Bir PHP komut dosyası çalıştırıldığında, bir iş parçacığı PHP komut dosyasını çalıştırır.

Script sleep(100), komut çalıştırmak için 100 saniye sürer ne zaman .. Bu sizin iş parçacığı 100 saniye kadar bağlı olduğu anlamına gelir.

10 konuları var ve 10 kişi giriş - ki - Sorun işçi-iş parçacığı çok sonlu bir dizi var, şimdi web sunucusu başka yanıtları hizmet edemez ..

(Giriş (ya da diğer eylemler) limit Oranı en iyi yolu hızlı bellek depolama şey bir tür (memcached bunun için idealdir) kullanmak için, ama o ayrı bir süreç çalışan gerektirir ve oldukça karmaşıktır Eğer Facebook gibi bir şey çalıştırmak eğer bunu yapabilirsiniz ..).

Basit, bir veritabanı tablo olabilir mağazaları user_id veya ip_address, first_failed ve failure_counter söyledi.

Eğer başarısız bir giriş olsun, her zaman, sen (sözde kod) yapardı:

if (first_failed in last hour) and (failure_counter > threshold):
    return error_403("Too many authentication failures, please wait")
elseif first_failed in last hour:
    increment failure_counter
else:
    reset first_failed to current time
    increment failure_counter

Belki de en verimli, ve orada daha iyi yollar, ancak kaba-zorlama oldukça iyi durması gerekir değil. Memcached kullanılması (daha hızlı olan) temelde aynıdır, ancak veritabanı memcached ile değiştirilir

to stop bots, malicious users, etc. from executing php scripts too fast?

Ben ilk gerçekten önlemek için çalışıyoruz ne sormak istiyorsunuz? Bu reddi-of-service saldırıları ise, o zaman ben size PHP ekleyebilirsiniz ne ile sınırlı ise yapabileceğiniz bir şey olduğunu söylemek olurdu. Sanat devlet çok programcılar olarak biz karşı koruyabilirsiniz ne dışındadır. Bu amaç için tasarlanmış sistem yöneticisi araçları bakarak başlayın.

Gerçek insanlar erişebilirsiniz ama botlar yapamam böylece Yoksa hizmeti sınırlamak için çalışıyoruz? Eğer öyleyse, ben bazı "Captcha" teknikleri bakmak istiyorum.

Ya da sitenizin her saniye yeni içerik arıyor yoklama engellemek için çalışıyoruz? Eğer öyleyse, ben bu yüzden sizin bant genişliği kadar yemeyin bir RSS beslemesi veya bunları bildiren diğer bazı yol sağlayan araştırmak istiyorum.

Yoksa başka bir şey mi?

Genel olarak, ben ne uyku () ne usleep () iyi bir yol olduğunu söyleyebilirim.

--
bmb

Önerdiğiniz yöntem oturum açmadan önce gereksiz yere beklemek TÜM kullanıcıları zorlar

En LAMBA sunucuları (ve çoğu router / switch, aslında) zaten Denial of Service saldırıları engellemek için yapılandırılmıştır. Onlar aynı IP adresinden gelen birden fazla ardışık isteklerini reddederek bunu.

Eğer php bir uyku koymak istemiyorum. Aksi takdirde büyük ölçüde açık bekletme düzenlenen bağlantıları var olacak çünkü işleyebilir sizin hizmet eşzamanlı istek sayısını azaltacaktır.

Çoğu HTTP sunucuları, DoS saldırıları önlemek için etkinleştirebilirsiniz özelliklere sahip, ama sadece çok yakın zamanda pek çok kez gördüm IP adreslerini takip ve onlara bir saniye için onları soran bir mesaj ile Yasak bir 403 göndermek gerektiğini başarısız.

Herhangi bir nedenle REMOTE_ADDR size login şeklinde bir meydan okuma kanıtlamak ve uzak tarayıcı üzerinde uzun bir hesaplama yapmak yapabiliriz kullanıcı spesifik (aynı güvenlik duvarının arkasında vb herkes) olmanın sayılmaz (diyelim ki, bir dizi faktör ) hızla () hızlı çarpma ile sunucu tarafında kontrol edebilirsiniz.