웹 요청에 대한 속도 제한 알고리즘을 구현하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1450217

문제

가능한/부분 복제 :

스팸 또는 무자비한 힘 공격을 줄이기 위해 웹 애플리케이션에 대한 이동 시간 윈도우 속도 제한 알고리즘을 구현하는 가장 좋은 방법을 찾고 있습니다.

사용의 예로는 "지난 5 분 동안 주어진 IP에서 최대 실패 로그인 시도 수", "마지막 N 분의 최대 수 (게시물/투표 등 ...)"입니다.

트위터 API와 같은 X 분마다 통계의 하드 리셋이 아닌 이동 시간 창 알고리즘을 사용하는 것이 좋습니다.

이것은 c#/asp.net 앱입니다.

도움이 되었습니까?

해결책

빠른 메모리 기반 해시 테이블을 사용하십시오 memcached. 키는 당신이 제한하는 대상 (예 : IP)이며 각 저장된 값의 만료는 최대 제한 시간이어야합니다.

각 키에 대해 저장된 값에는 각 시도의 시간과 함께 작업을 수행 할 때 마지막 N 시도의 직렬화 된 목록이 포함됩니다.

다른 팁

우리가 찾았 어 토큰 버킷 이러한 종류의 속도 제한에 대한 알고리즘이 더 좋습니다. 라우터/스위치에 널리 사용되므로 운영 담당자는 개념에 더 익숙합니다.

이 문제에 대해 더 '현대적인'대답을 추가하려면 .net webapi, webapithRottle 우수하고 아마도 당신이 원하는 모든 것을 상자 밖으로 할 수 있습니다.

그것은 또한입니다 Nuget에서 사용할 수 있습니다.

구현에는 1 분 정도 걸리며 사용자 정의 할 수 있습니다.

config.MessageHandlers.Add(new ThrottlingHandler()
{
    Policy = new ThrottlePolicy(perSecond: 1, perMinute: 30, perHour: 500, perDay:2000)
    {
        IpThrottling = true,
        ClientThrottling = true,
        EndpointThrottling = true
    },
    Repository = new CacheRepository()
});

이 페이지는 흥미로운 읽기라고 생각합니다.

http://www.codeproject.com/kb/aspnet/10aspnetperformance.aspx

찾을 수있는 섹션은 다음과 같이 시작합니다.

서비스 거부 (DOS) 공격 방지

웹 서비스는 유치원 해커조차도 비싼 작업을 수행하는 웹 서비스를 반복적으로 호출하여 서버를 무너 뜨릴 수 있기 때문에 해커에게 가장 매력적인 대상입니다.

편집 : 유사한 질문 :

ASP.NET MVC에서 요청 조절기를 구현하는 가장 좋은 방법?

방금 질문에 대한 답변을 추가했습니다 API 요율 제한이 초과되는 경우 5 분 동안 API 요청을 블록합니다.
나는 사용했다 HttpRuntime.Cache 분당 60 개의 요청 만 허용합니다. 한도를 초과하면 다음 5 분 동안 API가 차단됩니다.

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