문제

(이것은 언어에 대한 질문이지만, 제 경우에는 ASP.NET 3.5를 사용하고 있지만)

표준 ASP.NET을 사용하고 있습니다 로그인 제어 그리고 다음과 같은 로그인 시도 스로틀 로그를 구현하고 싶습니다.

  • 처리 OnLoginError 이벤트 및 유지 세션, 실패한 로그인 시도 카운트
  • 이 카운트가 도착하면 일부 구성 가능한 값 원래 IP 주소 또는 해당 사용자 / 해당 사용자에 대한 추가 로그인 시도 차단

이것은 현명한 접근 방식처럼 들리나요? 그러한 수표를 우회 할 수있는 명백한 방법이 없습니까?

참고 : ASP.NET 세션은 쿠키를 사용하여 사용자의 브라우저와 관련이 있습니다.

편집하다

이것은 영국과 인도에서만 사용할 행정장을위한 것입니다.

도움이 되었습니까?

해결책

제프 아트 우드 다른 접근법을 언급 : 여러 시도 후 계정을 잠그지 않고 다른 로그인 시도가 허용 될 때까지 시간을 늘리십시오.

1st failed login    no delay
2nd failed login    2 sec delay
3rd failed login    4 sec delay
4th failed login    8 sec delay
5th failed login    16 sec delay

이는 서비스 거부 공격에 대한이 보호 조치가 남용 될 수있는 위험을 줄일 것입니다.

보다 http://www.codinghorror.com/blog/archives/001206.html

다른 팁

마지막으로 원하는 것은 데이터베이스에 실패한 모든 로그인 시도를 저장하는 것입니다. 이로 인해 충분히 작동하지만 DDOS 공격은 데이터베이스 서버를 낮추는 데 매우 사소합니다.

웹 서버에 일부 유형의 서버 측 캐시를 사용하고있을 것입니다. 이들은 IP 주소 및/또는 사용자 이름으로 실패한 시도를 추적하는 데 사용하기에 완벽한 시스템입니다. 로그인 시도에 대한 특정 임계 값이 초과되면 데이터베이스에서 계정을 비활성화하기로 결정할 수 있지만, 많은 판독 값을 저장하고 지속적으로 스토리지에 쓰기가 실패 할 필요가없는 로그인 카운터에 쓸 것입니다. 지속.

사람들이 무차별 대결 인증을 막으려 고한다면 Gumbo와 같은 스로틀 시스템이 아마도 가장 잘 작동한다고 제안했습니다. 그것은 정상적인 상황에서 또는 공격이 진행되는 동안 합법적 인 사용자의 영향을 최소화하면서 공격자에게 무너진 공격을 공격하지 않을 것입니다. 나는 Memcached 또는 이와 유사한 IP의 IP에 의한 실패한 시도를 계산하는 것이 좋습니다. 그리고 당신이 극도로 분산 된 Brute-Force 공격의 대상이된다면, 공격자가 있다고 가정 할 때 항상 사용자 이름 당 시도를 추적하기로 선택할 수 있습니다. 실제로 동일한 사용자 이름을 자주 시도합니다. 시도가 극도로 분산되지 않는 한, 여전히 많은 양의 IP 주소에서 나오는 것처럼 초기 By-IP 코드는 공격자를 적절하게 유지해야합니다.

제한된 수의 IP 주소를 가진 국가의 방문자 문제를 방지하는 핵심은 임계 값을 너무 엄격하게 만드는 것입니다. 몇 초 안에 여러 번의 시도를받지 못하면 Re에 대해 걱정할 것이 많지 않을 것입니다. 스크립트 무차별 대형. 다른 사용자의 암호를 수동으로 풀려고하는 사람들에 대해 더 관심이있는 경우 사용자 이름으로 후속 로그인 시도에 대한 더 넓은 경계를 설정할 수 있습니다.

귀하의 질문에 대답하지는 않지만 다소 관련이있는 또 다른 제안은 최종 사용자에게 특정 수준의 암호 보안을 시행하는 것입니다. 나는 혼합 사례, 적어도 X 캐릭터, 비 사고 등을 요구하면서 배 밖으로 나가지 않을 것입니다. 사람들이 자신의 사용자 이름을 암호로 사용하는 것을 막는 것은 서비스와 사용자가 가장 정교하지 않은 사람들로부터 사용자를 보호하기 위해 매우 먼 길을 가야합니다 (왜 그들이 무차별 대전이라고 부르는지 추측)-공격.

연속적인 로그인 시도에 지연이 증가하는 것을 삽입하는 허용 된 답변은 구현 방법에 따라 ASP.NET에서 매우 열악 할 수 있습니다. ASP.NET은 스레드 풀을 사용하여 서비스 요청을 사용합니다. 이 스레드 풀이 소진되면 스레드를 사용할 수있을 때까지 들어오는 요청이 대기됩니다.

Thread.Sleep (N)를 사용하여 지연을 삽입하면 지연 시간 동안 ASP.NET 스레드 풀 스레드를 묶습니다. 이 스레드는 더 이상 다른 요청을 실행할 수 없습니다. 이 시나리오에서 간단한 DOS 스타일 공격은 로그인 양식을 계속 제출하는 것입니다. 결국 요청을 실행하는 데 사용할 수있는 모든 스레드는 수면 (및 증가 기간 동안)입니다.

이 지연 메커니즘을 올바르게 구현하는 유일한 방법은 비동기 HTTP 처리기를 사용하는 것입니다. 보다 연습 : 비동기 HTTP 처리기 생성. 구현은 다음과 같을 것입니다.

  1. 시작 처리 중 인증을 시도하고 실패시 지연을 결정합니다.
  2. 지연 후 트리거 될 waithandle을 노출시키는 Iasyncresult를 반환하십시오.
  3. EndProcessRequest에서 WaithAndle이 트리거되었거나 블록이 발생했는지 확인하십시오.

이것은 당신의 진정한 사용자에게도 영향을 줄 수 있습니다. 전. 싱가포르와 같은 국가에는 ISP가 제한되어 있으며 집 사용자가 사용할 수있는 더 작은 IP 세트가 있습니다.

또는 X가 스크립트 어린이를 방해하려는 시도가 실패한 후 보안 문자를 삽입 할 수 있습니다.

세션 외부에서 카운트를 유지해야한다고 생각합니다. 그렇지 않으면 사소한 공격은 각 로그인 시도 전에 쿠키를 청소하는 것입니다.

그렇지 않으면 카운트와 잠금이 합리적입니다. 더 쉬운 솔루션은 각 로그인 고장 사이에 두 배가되는 시간을 가질 수 있습니다. 즉, 첫 로그인 시도 후 2 초, 다음 후 4 초, 8 등

시간 초과 기간에 로그인을 거부하여 타임 아웃을 구현하십시오. 사용자가 올바른 비밀번호를 제공하더라도 계정이 잠겨 있다고 말하는 사람을 읽을 수있는 텍스트로 답장하십시오.

또한 동일한 IP/다른 사용자 및 동일한 사용자/다른 IP를 모니터링하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top