문제

고 응용 프로그램을 개발하고있 Google App Engine,해야 하는지 너무 많은 트래픽이다.내가 정말이 아니라 돈을 지불하지 않을 초과하는 무료량을 할당.그러나,그것은 아주 쉬워진답니다 원인 서비스 거부 공격에 의해 오버로드 앱기 위해 최선을 다하고 할당량입니다.이 있를 방지하기 위해 어떤 방법이거나 그것이 어렵게 초과하는 무료 할당량?나는 할 수 있었다,예를 들어,의 수를 제한 요청에서 IP(어렵게 만드는 초과하는 CPU 를 할당)하지만,어떤 방법이 어렵게 초과 요청 또는 대역폭 쿼?

도움이 되었습니까?

해결책

DOS를 방지하기위한 내장 도구가 없습니다. Java를 사용하여 Google Apps를 작성하는 경우 service.FloodFilter 필터. 다음 코드는 서블릿을하기 전에 실행됩니다.

package service;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;


/**
 * 
 * This filter can protect web server from simple DoS attacks
 * via request flooding.
 * 
 * It can limit a number of simultaneously processing requests
 * from one ip and requests to one page.
 *
 * To use filter add this lines to your web.xml file in a <web-app> section.
 * 
    <filter>
        <filter-name>FloodFilter</filter-name>
        <filter-class>service.FloodFilter</filter-class>
        <init-param>
            <param-name>maxPageRequests</param-name>
            <param-value>50</param-value>
        </init-param>
        <init-param>
            <param-name>maxClientRequests</param-name>
            <param-value>5</param-value>
        </init-param>
        <init-param>
            <param-name>busyPage</param-name>
            <param-value>/busy.html</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>JSP flood filter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
 *  
 *  PARAMETERS
 *  
 *  maxPageRequests:    limits simultaneous requests to every page
 *  maxClientRequests:  limits simultaneous requests from one client (ip)
 *  busyPage:           busy page to send to client if the limit is exceeded
 *                      this page MUST NOT be intercepted by this filter
 *  
 */
public class FloodFilter implements Filter
{
    private Map <String, Integer> pageRequests;
    private Map <String, Integer> clientRequests;

    private ServletContext context;
    private int maxPageRequests = 50;
    private int maxClientRequests = 10;
    private String busyPage = "/busy.html";


    public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException
    {
        String page = null;
        String ip = null;

        try {
            if ( request instanceof HttpServletRequest ) {
                // obtaining client ip and page URI without parameters & jsessionid
                HttpServletRequest req = (HttpServletRequest) request;
                page = req.getRequestURI();

                if ( page.indexOf( ';' ) >= 0 )
                    page = page.substring( 0, page.indexOf( ';' ) );

                ip = req.getRemoteAddr();

                // trying & registering request
                if ( !tryRequest( page, ip ) ) {
                    // too many requests in process (from one client or for this page) 
                    context.log( "Flood denied from "+ip+" on page "+page );
                    page = null;
                    // forwarding to busy page
                    context.getRequestDispatcher( busyPage ).forward( request, response );
                    return;
                }
            }

            // requesting next filter or servlet
            chain.doFilter( request, response );
        } finally {
            if ( page != null )
                // unregistering the request
                releaseRequest( page, ip );
        }
    }


    private synchronized boolean tryRequest( String page, String ip )
    {
        // checking page requests
        Integer pNum = pageRequests.get( page );

        if ( pNum == null )
            pNum = 1;
        else {
            if ( pNum > maxPageRequests )
                return false;

            pNum = pNum + 1;
        }

        // checking client requests
        Integer cNum = clientRequests.get( ip );

        if ( cNum == null )
            cNum = 1;
        else {
            if ( cNum > maxClientRequests )
                return false;

            cNum = cNum + 1;
        }

        pageRequests.put( page, pNum );
        clientRequests.put( ip, cNum );

        return true;
    }


    private synchronized void releaseRequest( String page, String ip )
    {
        // removing page request
        Integer pNum = pageRequests.get( page );

        if ( pNum == null ) return;

        if ( pNum <= 1 )
            pageRequests.remove( page );
        else
            pageRequests.put( page, pNum-1 );

        // removing client request
        Integer cNum = clientRequests.get( ip );

        if ( cNum == null ) return;

        if ( cNum <= 1 )
            clientRequests.remove( ip );
        else
            clientRequests.put( ip, cNum-1 );
    }


    public synchronized void init( FilterConfig config ) throws ServletException
    {
        // configuring filter
        this.context = config.getServletContext();
        pageRequests = new HashMap <String,Integer> ();
        clientRequests = new HashMap <String,Integer> ();
        String s = config.getInitParameter( "maxPageRequests" );

        if ( s != null ) 
            maxPageRequests = Integer.parseInt( s );

        s = config.getInitParameter( "maxClientRequests" );

        if ( s != null ) 
            maxClientRequests = Integer.parseInt( s );

        s = config.getInitParameter( "busyPage" );

        if ( s != null ) 
            busyPage = s;
    }


    public synchronized void destroy()
    {
        pageRequests.clear();
        clientRequests.clear();
    }
}

파이썬을 사용하는 경우 자신의 필터를 굴려야 할 수도 있습니다.

다른 팁

가능한지 잘 모르겠지만 앱 엔진 FAQ DOS 공격임을 보여줄 수 있다면 공격과 관련된 요금을 환불 할 것입니다.

Python과 Java 모두에 사용할 수있는 IP-Address 기반 필터가있는 것 같습니다 (이것은 오래된 스레드라는 것을 알고 있지만 여전히 Google 검색에서는 여전히 높아집니다).

https://developers.google.com/appengine/docs/python/config/dos

앱 엔진 애플리케이션 앞에서 서비스 거부 보호 기능을 제공하는 서비스를 항상 사용할 수 있습니다. 예를 들어 CloudFlare는 잘 존경받는 서비스를 제공합니다 https://www.cloudflare.com/waf/, 그리고 다른 사람들이 있습니다. 이러한 기능을 무료 계획에서 사용할 수 있다는 것은 (면책 조항 : 개인적으로 서비스를 사용하지 않았습니다) 내 이해입니다.

또한 애플리케이션 자체에서 Memcache 기반 요율 제한 구현을 구성하는 것도 매우 쉽습니다. 이 방법에 대한 Google 검색에서 얻은 첫 번째 타격은 다음과 같습니다. http://blog.simonwillison.net/post/57956846132/ratelimitcache. 이 메커니즘은 건전하며 공유 된 Memcache 사용이 충분하고 무료이므로 비용 효율적일 수 있습니다. 또한,이 경로를 사용하면 손잡이를 제어하게됩니다. 단점은 응용 프로그램 자체가 HTTP 요청을 처리하고 허용하거나 거부하기로 결정해야하므로 처리 할 비용 (또는 [무료] 할당량 소진)가있을 수 있습니다.

전체 공개 : App Engine에서 Google에서 일하며 Cloudflare 또는 Simon Willison과 관련이 없습니다.

GAE 방화벽 최근에 출시하도록 대체하는 이전에,오히려 제한 DoS 보호 서비스.

그것은 지원 프로그래밍 업데이트를 방화벽의 규칙을 통해(나)관리 API: 다.방화벽입니다.ingressRules 는 결합될 수 있는 응용 프로그램 내의 조각을 논리 DoS 검색에 설명된 대로 다른 답변이 있습니다.차이 될 것입하는 한 규칙은 배치된 요청은 더 이상 발생하지 않는 응용 프로그램에 도달합,더 이상 그렇-응용 프로그램을 필터링 그 자체가 필요하지 않습니다.

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