PHP Brute-force/DoS önleme

4 Cevap php

Ben inşa ediyorum bir web brute-force giriş girişimlerini önlemek için bir komut dosyası yazmak çalışıyorum. Mantık böyle bir şey gider:

  1. Kullanıcı giriş bilgilerini gönderir.
  2. Check if username ve password is correct
    • Evet, onları içeri
    • If No, record a failed attempt in the database. Check if there's too many fails within a given timeframe (eg: 5 in 5 minutes):
      • sleep(10), daha sonra kullanıcıya bir oturum açma hatası rapor: Evet, o 10 saniye boyunca yürütülmesini duraklatmak.
      • Hemen kullanıcıya bir oturum açma hatası bildir

Bir meslektaş bu açıklayan, ben bir hacker bir saniyede, diyelim ki, 1000 istekleri gönderilen bu yardım nasıl istendi. Ilk 5 hemen dönecekti ve daha sonra kalan 995 hepsi sadece 10 saniye sürer misin?

Ben tam HTTP nasıl çalıştığını anlamıyorum bir sinsi bir şüphe var - hatta mümkün üstünde olduğu durum, ya da sunucu bir istemci idvardır edecek eşzamanlı istek sayısı için bir sınır var mı?

Daha iyi bir çözüm artan bir uyku vaktim olurdu?

sleep($numRequestsInLast5Minutes - 5)

Yani ilk 5 hızlı olacak ve daha sonra sonraki her bir uyku artacaktır.

4 Cevap

Kullanıcı çabaladılar varsa ben öneririm, beş katından fazla ve beş dakika demek, bir 503 Service Unavailable, hemen o IP adresi için dönen başlar. Bir oturum açma başarısız olduğunda, bir IP için geçerli kötü girişimleri almak için memcache kullanın ve sonra miktarını artırmak, ve 5 dakikalık bir sürenin ile memcache için geri kurtarabilir.

Bu tek bir kullanıcı web sunucuya bağlantı birçok oluşturmak ve potansiyel olarak diğer kullanıcıları çökertmek sağlayacak gibi, PHP kodu bir sleep koymak istemiyorum.

Kullanıcı oturum olmadığı için, size bir oturum tanımlama yok, ve kullanıcı bir hesaba onların yol kaba kuvvet çalışıyor, onlar hiç bir tanımlama mevcut değil.

Ben böyle bir şey kullanmış ...

  1. Kullanıcı adınızı ve şifrenizi kontrol edin

    1.1 Hiçbir maç sonra, rekor geçen bu combo ve başarısız oturum açma sayısı için giriş zamanı başarısız oldu.

    1.2 Adet (örneğin 10 dakika gibi) için maksimum, failsCount * 30 saniye gibi bir şey yapın edememek arasındaki bekleme yapar başarısız.

  • Bu bir kaba kuvvet saldırısı katlanarak daha uzun ve daha uzun sürer demektir.
  • Bu bir kullanıcı, kilit olabilir - ama lokavt döneminde giriş için çalışıyor iken hatalı giriş saymaz. Bu onu en aza indirmek gerekir.

Bu gelişmiş ama henüz vahşi içine serbest değil, bu nedenle herhangi bir geribildirim takdir ettik.

Sorun kullanıcı erişilebilirlik ve saldırgan modeli arasındaki dengedir.

First Solution

If not password correct for a certain number of time:
    block the user
    send a reset link to the user

User: could be blocked, and they don't like to reset
Attacker: blocked all users by trying to authenticate to all users (especially if all logins are publicly available)

Second solution

If not password correct:
    sleep(amount_of_time)

Soru: 'ammount_of_time' değeri nedir?

User: can be annoying to wait 'ammount_of_time' for each error
Attacker: keep trying, with lower test / seconds

Third Solution

If not password correct:
    sleep(amount_of_time)
    ammount_of_time = ammount_of_time * 2

User: less anoying for few password mistakes
Attacker: block the user to connect by sending lot of incorrect password

Fourth Solution

If not password correct for a certain number of time:
    submit a catchpa

User: need to resolve the catchpa (not too complex)
Attacker: need to resolve the catchpa (must be complex)

İyi bir çözüm (ve sitelerin bir sürü tarafından kullanılır) ama be careful to our catchpa. implementation. Neyse bir hile (sonraki çözümü bakınız) vardır.

Fifth Solution

If not password correct for a certain number of time:
    block the ip
    (eventually) send a reset link

User: User may be blocked because he cannot correctly remember his password.
Attacker: trying the same password with different user, because blocking is based on number of login by user.

Final Solution ?

If several login failed whatever is the user by an IP :
    print a catchpa for this IP

User: User cannot be IP blocked but must remember its password.
Attacker: difficult to have an efficient bruteforce

The important notes

Giriş formu veya giriş engellendi linki göndermek mi? Giriş formu engelleme işe yaramaz.

Bruteforce direnç İLK parola karmaşıklığı bir sorun olduğunu, bu yüzden (özellikle dağıtılmış kaba kuvvet durumunda) sıkı bir şifre politikası gerekiyor.

Ben tuz ile parolalarınızı hash aslında, zaten bu hakkı yapıyoruz söz etmiyor? Bu bruteforcing daha parola veritabanına erişmek için kolay ise, saldırganın bu çözümü tercih ("A chain is only as strong as its weakest link"). Çünkü

Ben en iyi uygulama nedir emin değilim, ama DOS saldırıları ile uğraşırken, daha iyi bir strateji aslında sunucudan away trafiği olduğunu. Senin hala isteği işleme ve php çalışıyor çünkü zaman aşımı ayarlama aslında alışkanlık yardımcı olur.

Eğer giriş sayfasında basit bir aşağı elimden sürümünü çalıştıran başka bir web sunucusu kurma kabul var. Kullanıcı (binlerce kez gibi) pek çok kez çalıştığında, yönlendirici yapılandırmanız ve ikinci web sunucusu bu kullanıcıyı yönlendirmek için mesaj gönderebilirsiniz.

Web siteleri slashdot etkisi ile vurmak olsun zaman onun gibi, çoğu sadece trafik azaltır zamana kadar uzak trafiği yönlendirmek.