2009-07-31 2 views
3

사용자 이름과 암호가 필요한 로그인 시스템이 있습니다. 일정량의 로그인 시도 실패 후 보안 문자를 표시하고 싶습니다. 이것을 구현하는 올바른 방법은 무엇입니까? 나는이 사이트를 읽었으며 몇몇 해결책은 users 테이블에 'failed-attempts-count'가 추가되는 것이 좋습니다. 그러나 실패한 시도가 특정 사용자에게 연결되지 않아야합니다. 즉, 입력 한 사용자 이름이 시스템에 있는지 여부에 관계없이 보안 문자를 표시하고 싶습니다. 이 변수를 세션 변수에 저장하는 것이 좋습니다 (PHP를 사용하고 있습니까)? 그렇다면 세션 변수에 필요에 따라 데이터를 던지는 단점이 있습니까? 나는이 세션 ID에 대한 로그인 시도를 관련시키는 표를 만들 수 있도록 사이트의 모든 방문자 (이미 로그인했거나 로그인하지 않은 사용자)에 대해 이미 세션 ID를 보유하고 있습니다 ... 가장/가장 안전한 접근 방법에 대한 아이디어가 있습니까? 감사.사용자와 상관없이 로그인 시도를 제한 하시겠습니까?

업데이트 : 업데이트 : 세션 ID가 해커가 단순히 캐시를 지울 수 있기 때문에 가장 좋은 아이디어는 아닌 것 같습니다 (단,이 사실은 문제가됩니다. 쓸모 없게 만들 정도로?). 다른 옵션은 IP입니다 ...하지만 실패한 시도가 공유되기 때문에 인트라넷이나 프록시 아래의 사용자에게는 주저합니다 .... 나는 다른 방법을 생각할 수 없습니다. 당신이 할 수 있습니까?

답변

6

세션 ID를 사용하는 위험은 무차별 공격을하는 사람이 각 시도마다 쿠키를 지우고 그에 따라 새로운 세션을 제공 할 수 있다는 것입니다.

자동화 된 무차별 공격은 각 요청에 대해 전송 된 쿠키를 조작 할 수있는 브라우저 외부의 스크립팅 언어로 작성 될 수 있습니다.

이 작업을 수행하는 또 다른 방법은 사용자 원본 IP가있는 테이블을 만들고 거기에 카운터를 추가하는 것입니다. 그러나 이것은 사용자가 프록시 서버를 사용하는 것을 불편하게 할 것입니다. 그러나 최소한 동일한 위치에서 반복적으로 암호를 추측하려는 사용자를 파악할 수 있습니다.

업데이트 : 연속적으로 무차별 공격을 시도하는 동안 쿠키를 삭제해도 자동으로 수행되고 거의 즉시 발생하므로 공격 속도가 느려지지는 않습니다. 이러한 유형의 공격에서 쿠키 조작은 매우 일반적입니다. 쿠키를 수정하는 것은 브라우저의 캐시를 지우는 것과는 다릅니다 (일반적으로 파일을 삭제해야하기 때문에 시간이 걸립니다). 공격자가해야 할 일은 쿠키가 보내지지 않도록하는 것입니다.

1

해커가 브라우저를 닫고 시도 할 때마다 세션 접근 방식이 작동하지 않으므로 실패한 시도 횟수와 마지막 시도 시간을 저장하는 테이블이 생깁니다 (한 시간이 지나면 확인 가능). 카운터를 재설정 할 수 있음) 사용자 당 가장 안전한 방법입니다.

+0

맞아요.하지만 captcha의 생각은 자동으로 무차별 공격을 막는 것입니다. 브라우저가 닫히지 않거나 모든 시도가 끝나면 캐시를 지우지 않을까요? – oym

+0

당신은 사용자 당 실패한 시도를 저장한다고 말합니다 - 이는 유효한 사용자 ID가 입력되면 실패한 시도 카운터가 증가한다는 것을 의미합니까 (사용자 ID와 암호가 모두 유효하지 않은 경우에는 표시되지 않습니다)? – oym

+0

잘 자동화 된 무차별 대입 공격은 WebClient 개체를 쉽게 파괴하고 모든 시도에 대해 새로운 공격을 생성 할 수 있습니다. 두 번째 부분에 대해서는 사용자 ID가 유효하지 않은 경우를 대비하여 세션 객체 내에 두 번째 폴백 보안 계층을 구현할 수 있습니다. 그러나 사용자 단위로 해킹 시도를 저장하면 IP 주소를 차단하는 것 이상의 작업을 수행 할 수 있으므로 실제적으로 PW를 변경하고 사용자의 이메일 주소로 이메일을 보낼 수 있습니다 (전 블리자드가 전에 보았습니다). – Blindy

1

후 적절한 증가는 시간 제한이있는 IP 주소에서 잘못된 로그인 시도 명령을 사용 (memcache에도 설치하는 memcached와 서버를 필요로 여기 http://www.danga.com/memcached/ 참조) 어떤 스위트 룸이든 (5 분, 30 분 등 ...). 이렇게하면 무차별 대입 시도가 (경합 조건에 대한 걱정없이) 빠르게 발생하는지 결정할 수 있으며 일정 시간이 지나면 블록이 자동으로 만료됩니다.

APC 예제 : 물론

$max_attempts = 5; // max attempts before captcha 
$attempts = apc_fetch('login_attempts_'.$ip)); 
if($attempts and $attempts>$max_attempts){ 
    // block code here or redirect, captcha etc... also suggest a short sleep time to delay answer, slow down bot 
}else{ 
    // check login here, run next code if login fails 
    if($login_failed){ 
     if(!$attempts){ 
      apc_store('login_attempts_'.$ip,1,$timeout); 
     }else{ 
      // function NOT currently documented on php.net, increments number stored in key 
      apc_inc('login_attempts_'.$ip); 
     } 
    } 
} 

그것은 매우 거친 예입니다 ...하지만 당신은 아이디어를 얻을

0

당신이 얻을 수있는 가장 정확한 정보는 그들의 IP 주소입니다. 사용자가 단순히 세션 쿠키 (예 : 컬 사용)를 무시할 수 있기 때문에 정확한 것으로 원하면 세션 쿠키를 사용하지 마십시오. 그러나 공유 ips에 대해 걱정이된다면 브라우저 에이전트와 같은 추가 정보를 포함 시키거나 아약스를 사용하여 다르게 얻을 수없는 다른 정보를 되돌려 보려 할 수 있습니다. 그러나 IP 주소 이외의 다른 모든 것들은 위조 될 수 있습니다 (프록시조차도 사용할 수 있습니다).

관련 문제