Çok denemeden sonra oturum açma girişimleri geciktirmek nasıl (PHP)

3 Cevap php

Ben potansiyel kullanıcıları bir sürü olacaktır PHP inşa oldukça büyük bir web sitesinde çalışıyorum. Ben otomatik girişimlerine giriş ekranı korumak için bir yol haline arıyorum. Zaten kayıt formuna bir CAPTCHA kontrol dahil, henüz daha siteyi sertleşmesine istiyorsunuz.

Ben biliyorum, ve ben (oturum açma girişimleri ve db onların zaman saklamak) sıfırdan kendimi bu uygulama yeteneğine sahip değilim, ama ben bu yolu sevmediğim biliyorum StackOverflow benzer sorular var:

  • Kavramsal olarak, ben mantık bu tür web sunucusu / altyapı düzeyinde değil, uygulama düzeyinde aittir düşünüyorum. Benim uygulamada bu mantık ve karmaşıklığa sahip hoşlanmazlar
  • Özellikle veritabanı düzeyinde, performansı hakkında endişe.
  • Ben sıfırdan böyle bir ortak yarar kurmak isteyen değil tarafından iyi bir şekilde, tembelim

Herhangi bir tavsiye takdir, ben özellikle bu yapabilirim Apache modülü çeşit arıyorum düşünüyorum. Benim platformu (CodeIgniter'ı kullanarak) PHP5, Apache2, MySQL 5'tir.

3 Cevap

iyi bir başlangıç ​​olacağını sadece sleep(1); sonra başarısız oturum açma girişimi - uygulanması kolay, neredeyse bug-free.

1 saniye (insanlar tarafından oturum açma girişimleri genellikle başarısız değilsiniz, özellikle çünkü) bir insan için çok değil, ama 1sec/try kaba kuvvet ... sloooow! Sözlük saldırıları başka bir sorun olabilir, ancak aynı etki alanında bulunuyor.

Saldırgan bu aşmak için çok may bağlantıları başlarsa, DOS atak bir türlü başa. sorun çözüldü (ama şimdi başka bir sorun ^ ^ var).

düşünmelisiniz bazı şeyler:

  • Eğer bir IP bazında soley hesaplarını kilitlemek ise, özel ağlar ile ilgili sorunlar olabilir.
  • Eğer bir kullanıcı adı bazda soley hesaplarını kilitlemek eğer, denial-of-service saldırıları agains Adlarını mümkün olacaktır bilinir
  • (username saldırıya biri olduğu) bir IP / username bazında kilitleme iyi işe yarayabilir

my suggestion: complete locking is not desireable (DOS), so a better alternative would be: count the login attempts for a certain username from a unique IP. you could do this with a simple table failed_logins: IP/username/failed_attempts

giriş başarısız olursa, wait(failed_attempts); saniye. her xx dakika, failed_logins:failed_attempts teker azalır bir cron komut dosyasını çalıştırın.

Üzgünüm, ben bir premade çözüm sağlayamaz, ama bunu uygulamak için önemsiz olmalıdır.

Tamam, tamam. Burada pseudocode bulunuyor:

<?php
$login_success = tryToLogIn($username, $password);

if (!$login_success) {
    // some kind of unique hash
    $ipusr = getUserIP() . $username;

    DB:update('INSERT INTO failed_logins (ip_usr, failed_attempts) VALUES (:ipusr, 1) ON DUPLICATE KEY UPDATE failed_logins SET failed_attempts = failed_attempts+1 WHERE ip_usr=:ipusr', array((':ipusr' => $ipusr));

    $failed_attempts = DB:selectCell('SELECT failed_attempts WHERE ip_usr=:ipusr', array(':ipusr' => $ipusr));

    sleep($failed_attempts);
    redirect('/login', array('errorMessage' => 'login-fail! ur doin it rong!'));
}
?>

disclaimer: bu belli bölgelerde çalışmayabilir. duyduğum son şey Asya'daki bütün bir ülke NAT'lanmış (ayrıca, hepsi kung-fu biliyorum) var oldu.

Çok kukla denenmemiş bir örnek, ama bence, siz) burada ana fikri bulacaksınız.

if ($unlockTime && (time() > $unlockTime))
{
    query("UPDATE users SET login_attempts = 0, unlocktime = 0 ... ");
}
else
{
   die ('Your account is temporary locked. Reason: too much wrong login attempts.');
}
if (!$logged_in)
{
    $loginAttempts++;
    $unlocktime = 0;
    if ($loginAttempts > MAX_LOGIN_ATTEMPTS) 
    {
        $unlockTime = time() + LOCK_TIMEOUT;
    }
    query("UPDATE users SET login_attempts = $loginAttempts, unlocktime = $unlocktime ... ");
}

Sorry for the mistakes - I wrote it in some seconds ad didn't test... The same you can do by IP, by nickname, by session_id etc...

Neden "sertleşme" ve aslında bu sorunu kadar app "ölçeklendirme" ile beklemiyorsun? En olası senaryo app "kullanıcıları çok" asla olmasıdır. Bu, benim için erken optimizasyonu gibi önlemek için bir şey geliyor.

  • Eğer kötüye botlar olsun, kayıdı sertleşir. Eğer> 1000 kaydolmalardır / gün oluyor başlayana kadar ben aslında captcha'yı kaldırmak istiyorum.
  • Eğer performans sorunları olsun, gerçek darboğazları tespit performansı artırabilirsiniz.