2013-10-04 107 views
1

agiletoolkit Auth/basic類允許嘗試登錄,沒有任何限制。 而我正在尋找一種方法來限制失敗的登錄嘗試次數,我試着重寫這個類的一些方法,但它使用Ajax重新加載,所以php代碼不能正確執行。Agiletoolkit失敗登錄嘗試的最大次數

任何建議是值得歡迎的。

非常感謝,

回答

1

通過StackOverflow的啓發我已實現了以下保障:

爲我們存儲軟/硬鎖定每個用戶。即使它是正確的,硬鎖也會拒絕驗證密碼。 軟鎖是一段時間後,我們將重置「不成功的嘗試」計數器。 每當你輸入不正確的密碼時,軟鎖和硬鎖的增加都會讓你等待更長的時間(但不會永遠) 逐步增加提供合理的限制,所以如果你的攻擊者試圖破解你的帳戶一個小時 - 他只會嘗試多次,但您的帳戶在幾個小時後即可登錄。 我已經在我的一個項目中實現了它,但它不是控制器,而是內置代碼。請通過意見看,我希望這將幫助您和他人:

在用戶添加到模型:

$this->addField('pwd_locked_until'); 
$this->addField('pwd_failure_count'); 
$this->addField('pwd_soft_unlock'); 

你還需要兩個方法:

/* Must be called when user unsuccessfully tried to log-in */ 
function passwordIncorrect(){ 
    $su=strtotime($this['pwd_soft_unlock']); 
    if($su && $su>time()){ 
     // aw, they repeatedly typed password in, lets teach them power of two! 
     $this['pwd_failure_count']=$this['pwd_failure_count']+1; 
     if($this['pwd_failure_count']>3){ 
      $this['pwd_locked_until']=date('Y-m-d H:i:s',time() 
       +pow(2,min($this['pwd_failure_count'],20))); 

      $this['pwd_soft_unlock']=date('Y-m-d H:i:s',time() 
       +max(2*pow(2,min($this['pwd_failure_count'],20)),60*5)); 
     } 
    }else{ 
     $this['pwd_failure_count']=1; 
     $this['pwd_soft_unlock']=date('Y-m-d H:i:s',time() +60*5); 
    } 
    $this->save(); 
} 

/* Must be called when user logs in successfully */ 
function loginSuccessful(){ 
    $this['last_seen']=date('Y-m-d H:i:s'); 
    $this['pwd_soft_unlock']=null; 
    $this->save(); 
} 

最後 - 你可以用這個作爲登錄表單:

class Form_Login extends Form { 
    function init(){ 
    parent::init(); 

    $form=$this; 
    $form->setModel('User',array('email','password')); 
    $form->addSubmit('Login'); 

    if($form->isSubmitted()){ 

     $auth=$this->api->auth; 

     $l=$form->get('email'); 
     $p=$form->get('password'); 

     // check to see if user with such email exist 
     $u=$this->add('Model_User'); 
     $u->tryLoadBy('email',$form->get('email')); 

     // user may have also typed his username 
     if(!$u->loaded()){ 
      $u->tryLoadBy('user_name',$form->get('email')); 
     } 

     // incorrect email - but say that password is wrong 
     if(!$u->loaded())$form->getElement('password') 
      ->displayFieldError('Incorrect Login'); 

     // if login is locked, don't verify password at all 
     $su=strtotime($u['pwd_locked_until']); 
     if($su>time()){ 
      $form->getElement('password') 
       ->displayFieldError('Account is locked for '. 
       $this->add('Controller_Fancy') 
      ->fancy_datetime($u['pwd_locked_until'])); 
     } 

     // check account 
     if($auth->verifyCredentials($u['email'],$p)){ 
      // resets incorrect login statistics 
      $u->loginSuccessful(); 
      $auth->login($l); 

      // redirect user 
      $form->js()->univ()->location($this->api->url('/'))->execute(); 
     }else{ 
      // incorrect password, register failed attempt 
      $u->passwordIncorrect(); 
      $form->getElement('password')->displayFieldError('Incorrect Login'); 
     } 
    } 
    } 
} 

這應該由某人轉換成插件。

1

我想你可以存儲在會話或使用後負荷鉤餅乾Model_User的使用(通常在驗證中使用)的數字,然後檢查它,你需要。

糟糕。失敗登錄。所以你模型沒有加載。 您只需要對登錄表單按鈕的點擊次數進行計數並將其存儲在某個地方(Cookie,數據庫)。因此,創建自己的登錄表單並在提交表單時添加一些條件,例如:

$m = $this->add('Model_User'); 

    $f = $this->add("Form"); 
    $f->setModel($m, array('email', 'password')); 
    $f->addSubmit("Log In"); 

    if ($f->isSubmitted()){ 
     //Limmiting 
     if($_COOKIE[$this->api->name."_count_failed_login"] >= 5/*Here's you limit number*/){ 
      /*redirect or something else*/ 
     } 

     if (/*here should be you condition*/){ 
      $_COOKIE[$this->api->name."_count_failed_login"] = 0; 
      $this->api->auth->login($f->get("email")); 
      $f->js()->univ()->redirect("index")->execute(); 
     }else{ 
      /* when login is failed*/ 
      if($_COOKIE[$this->api->name."_count_failed_login"]){ 
       $_COOKIE[$this->api->name."_count_failed_login"]++; 
      }else{ 
       $_COOKIE[$this->api->name."_count_failed_login"] = 1; 
      } 
      $this->js()->univ()->alert('Wrong username or password')->execute(); 
     } 
    } 

我沒有檢查它。也許需要一些輔助。 只是一個想法。

希望有所幫助。