2011-07-29 2 views
1

로그인 양식을 작성 중입니다. 시도 횟수를 3 회로 제한하고 10 분 동안 양식 제출을 차단해야합니다. 다음 코드는 올바르게 작동하지 않으며 실패한 시도 후에 제출하는 것을 차단하는 방법을 알아야합니다. 감사.Security-PHP 로그인 시도 기능

function autoDefender($attempts,$username,$pass) 
    { 
    $logins=0; 
    $logins++; 
    $ats = $attempts-$logins; 
     if (isset($_POST['password']) && isset($_POST['userName'])) 
     { 
      if($_POST['password']!=$pass && $_POST['userName']!=$username) 
       { 
        if($logins == $attempts) 
         { 
         echo ("<div class='errmg'>Acess denied for 1 minute</div>"); 
         } 
        echo ("<div class='errmg'>Error: 
        invalid username or pass; <span class='atmpts'>$ats</span> attempts left</div>"); 
       } 
     } 
    } 
+0

저장된 값으로 쿠키를 만드는 방법과 10 분 후에 만료되도록 설정하는 방법에 대해 설명합니다. –

+1

좋은 질문입니다! 하지만 먼저'logins = 0'과'logins ++'라고 말하면'logins = 1'라고 말할 수 있습니다. 0으로 설정 한 다음 증가시킵니다. 따라서 항상 1이됩니다. – Milaan

+2

예를 들어 데이터베이스에 로그인 시도를 저장해야합니다. 그리고 새로 시도 할 때마다 한계에 도달 할 때까지 +1을 한 다음 시간을 절약하고 사용자가 기다리게합니다. – ComFreek

답변

4

autoDefender을 호출 할 때마다 로컬 변수 $logins0으로 재설정됩니다. 따라서 실제로 시도 된 횟수는 autoDefender 번의 여러 통화에서 유지되지 않습니다.

이 정보는 어딘가에 지속적으로 저장해야합니다. 귀하의 경우에도 여러 요청에 걸쳐.

다른 사용자를 잠글 수 있기 때문에 DoS (Denial of Service) 공격의 공격 대상이 될 수 있습니다. 따라서 실패한 시도의 속성을 두 번 생각해야합니다. 사용자별로 수행하는 경우 공격자는 모든 사용자에 대해 대량 공격을 수행 할 때 많은 사용자를 잠글 수 있습니다. 원격 클라이언트 (예 : IP 주소)별로 수행하는 경우 동일한 시스템 (예 : 회사 또는 대학 네트워크)을 사용하는 다른 무고한 사용자를 잠글 수 있습니다. 세션 당이를 수행하면 공격자는 발급 된 세션 ID를 삭제할 수 있습니다.

1
코드가 너무마다 $ 로그인 그래서, 당신이 0 아닌 변수를 초기화 할 필요가 0으로 초기화, 처음부터마다 실행되고 있기 때문에

하지만, 이전의 로그인 시도 횟수의 값과에서 이 ip (어딘가에, 즉 데이터베이스에 저장되어야 함).

쿠키 (또는 세션)에 $ 로그인을 저장하라는 제안을 듣지 마십시오. 그것은 공격자가 단순히 지울 수 있습니다. 대신, 서버 측에 어딘가에 저장하십시오 : sql database, memcached, berkley db, ... 옵션이 많이 있습니다.

마지막으로, 나를 위해 기본 (웹, 그리고 아마도 웹뿐만 아니라) 프로그래밍 개념을 오해하고있는 것 같습니다. 따라서 멘토와 코드를 재확인하거나 stackexchange 네트워크의 코드 검토 사이트를 사용하는 것이 좋습니다. 특히 중요한 보안 관련 코드를 작성할 때 특히 그렇습니다.

+0

xml 또는 json 어디서? XML과 json은 데이터베이스 또는 스토리지 엔진이 아닌 형식 일뿐입니다. 텍스트 파일을 읽거나 덤프하는 것에 대해 이야기하고 있다면 간단하고 빠른 berkleydb이 당신을 대신해 처리하는 동안 독자적으로 동시성 문제에주의를 기울여야합니다. – rvs

+0

나는 $ login이 0으로 초기화되었다는 것을 안다. 누군가가 변수를 초기화하고 올바르게 증가시키는 방법을 말할 수 있었기 때문에 나는 이것을 썼다. 프로그래밍 개념이 무엇인지 모르기 때문이 아니다. – George

+0

따라서 변수를 0으로 초기화하지 말고이 IP의 이전 로그인 시도 횟수를 초기화해야합니다. – rvs

관련 문제