2009-09-20 4 views
24

가능/부분 중복 : 나는 줄일 수있는 웹 응용 프로그램에 대해 알고리즘을 제한 이동 시간 창 속도를 구현하는 가장 좋은 방법을 찾고 있어요웹 요청에 대한 속도 제한 알고리즘을 구현하는 가장 좋은 방법은 무엇입니까?

스팸 또는 무차별 공격.

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

x 분마다 통계를 하드 리셋하지 않고 이동 시간 창 알고리즘을 사용하는 것을 선호합니다 (예 : twitter api).

이것은 C#/ASP.Net 앱용입니다.

+0

나는 제공된 속마음이 실제로 asp.net/c# 기울임 꼴로이 질문에 응답하지 않는다고 생각합니다. – spender

+0

@spender : 따라서 "possible"이라는 단어가 ;-) – Argalatyr

+0

원래 질문 내용이 아닌 "닫기"유권자에게 실제로 지시되었습니다. – spender

답변

10

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

각 키에 저장된 값에는 작업을 수행 할 때 마지막으로 시도한 N 개의 시도 목록과 각 시도 시간이 포함됩니다. 다음과 같이

http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx

섹션이 시작 피려 :

+2

그래서 각 시도에 대해 캐시 된 목록을 deserialize, 시간 창 외부 항목을 잘라내고 새 항목을 추가하고 항목 수를 계산하고 캐시를 업데이트할까요? – Lamar

+0

@Lamar Memcached 대신 Redis를 사용할 수 있습니다. Redis는 목록을 지원하고 기본적으로 get-first와 get-last를 지원합니다. Redis를 사용하면 전체 목록을 역 직렬화 할 필요가 없습니다. "redis rate limiting"에 대한 Google의 답변 – KajMagnus

+0

@KajMagnus Redis는 분명히 이것에 대한 올바른 해결책입니다. 목록을 지원하고 속도 제한 작업을 목록에 함께 적용하면 매우 편리합니다. – Lamar

23

우리는 Token Bucket이 속도 제한의 이런 종류의 더 나은 알고리즘임을 알게되었습니다. 라우터/스위치에서 널리 사용되므로 우리 작업 담당자는이 개념을 더 잘 알고 있습니다.

2

당신은 재미있는 읽기 수 있도록이 페이지를 찾을 수

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

웹 서비스는 해커를위한 가장 매력적인 대상입니다. 심지어 유치원 해커조차도 서비스를 중단시킬 수 있기 때문입니다. r을 반복적으로 호출하여 값 비싼 작업을 수행합니다.

편집 : 여기에 비슷한 질문 :

Best way to implement request throttling in ASP.NET MVC?

5

그냥이 문제에 좀 더 '현대적인'대답을 추가 : .NET WebAPI를 들어, WebApiThrottle 아마 우수하고 당신이에서 원하는 모든 것을 수행 상자.

또한 available on NuGet입니다.

구현에만 분 정도 소요되며 그것은 고도로 사용자 정의이다 :

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() 
}); 
관련 문제