현재 위치: > 최신 기사 목록> DOS 공격을 방지하기 위해 최대 연결 수를 Socket_Accept ()로 제한하는 방법

DOS 공격을 방지하기 위해 최대 연결 수를 Socket_Accept ()로 제한하는 방법

M66 2025-06-03

네트워크 프로그래밍에 PHP를 사용하는 경우 Socket_Accept ()는 클라이언트 연결을 수락하는 핵심 기능입니다. DOS (서비스 거부) 공격에 직면하여 공격자는 일반적으로 많은 수의 악의적 인 연결 요청을 사용하여 서버 리소스를 소진하여 서버가 정당한 사용자 요청에 대응할 수 없게합니다. 이 기사에서는 Socket_accept () 에서 허용되는 최대 연결 수를 제한하여 서버가 악의적으로 끌리는 것을 효과적으로 방지하는 방법을 설명합니다.

1. DOS 공격 및 연결 제한을 이해하십시오

DOS 공격에서 공격자는 서버의 서버의 동시 연결을 채우는 많은 동시 연결을 생성하여 서버가 새로운 일반 요청을 처리 할 수 ​​없게합니다. 최대 연결 수를 제한하고 서버가 리소스 권한 범위 내에서 특정 수의 클라이언트 연결 만 처리하는지 확인하면이 공격의 영향을 효과적으로 줄일 수 있습니다.

2. PHP Socket_accept ()를 사용하여 최대 연결 수를 제한하는 아이디어

  • 변수를 사용하여 현재 설정된 연결 수를 계산하십시오.

  • 새 연결이 수신되면 현재 연결 번호가 한계를 초과하는지 여부가 결정됩니다.

  • 한계가 초과 될 때 (새 연결을 닫음) 연결을 거부 하고 Socket_accept ()는 더 이상 처리하도록 호출되지 않습니다.

  • 연결이 닫히면 연결 수를 정시로 줄입니다.

3. 샘플 코드

다음 코드는 최대 연결이 100이라고 가정 할 때 PHP에서 Socket_accept ()를 기반으로 최대 연결 제한을 구현하는 방법을 보여줍니다.

 <?php
set_time_limit(0);
error_reporting(E_ALL);

$address = '0.0.0.0';
$port = 12345;
$maxConnections = 100;
$currentConnections = 0;

// 만들다 TCP Socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port) or die('바인딩이 실패했습니다');
socket_listen($sock);

echo "서버 시작,감시 장치 {$address}:{$port}\n";

$clients = [];

while (true) {
    // 최대 연결 수가 초과되는지 여부를 결정하십시오
    if ($currentConnections < $maxConnections) {
        // 비 블로킹 모드는 새로운 연결을 허용합니다
        socket_set_nonblock($sock);
        $client = @socket_accept($sock);

        if ($client !== false) {
            // 새로운 연결이 성공했습니다,하나를 세십시오
            $currentConnections++;
            $clients[] = $client;

            // 클라이언트 설정socket차단되지 않습니다
            socket_set_nonblock($client);

            echo "새로운 클라이언트 연결,현재 연결 번호: $currentConnections\n";
        }
    } else {
        // 최대 연결 수가 초과되었습니다,새로운 연결을 거부하십시오(선택적 대기 시간)
        usleep(100000); // 100ms
    }

    // 연결된 클라이언트의 데이터를 처리하기위한 폴링
    foreach ($clients as $key => $clientSocket) {
        $data = @socket_read($clientSocket, 2048, PHP_NORMAL_READ);

        if ($data === false) {
            // 단절,클라이언트를 제거하십시오
            socket_close($clientSocket);
            unset($clients[$key]);
            $currentConnections--;
            echo "클라이언트 연결이 끊어졌습니다,현재 연결 번호: $currentConnections\n";
            continue;
        } elseif ($data !== '') {
            $data = trim($data);
            if ($data === 'quit') {
                // 클라이언트는 적극적으로 연결을 끊습니다
                socket_close($clientSocket);
                unset($clients[$key]);
                $currentConnections--;
                echo "클라이언트는 적극적으로 연결이 끊어집니다,현재 연결 번호: $currentConnections\n";
                continue;
            }

            // 클라이언트가 보낸 프로세스 데이터
            $response = "수신 된 서버: {$data}\n";
            socket_write($clientSocket, $response, strlen($response));
        }
    }

    usleep(50000); // 줄이다CPU점유
}
?>

4. 코드 설명

  • 현재 활성 연결 수를 기록하려면 $ currentNections를 사용하십시오.

  • 최대 연결 수를 초과하지 않을 때만 새 연결을 받으려면 socket_accept ()를 호출하십시오.

  • 새 연결이 생성 된 후 클라이언트 소켓을 $ 클라이언트 배열로 저장하고 차단 모드로 설정하십시오.

  • $ 클라이언트를 폴링하여 클라이언트 데이터를 읽고 응답 후 계속 듣습니다.

  • 클라이언트가 Quit 명령을 분리하거나 보내는 경우 소켓을 닫고 연결 수를 줄입니다.

  • USLEEP ()를 사용하여 CPU 과잉 점유를 줄입니다.

5. 추가 보호 제안

  • 시간 초과 설정 : 클라이언트 연결 유휴 시간을 감지하면 타임 아웃이 자동으로 분리됩니다.

  • 단일 IP 연결 수 제한 : 단일 IP가 많은 연결을 제조하는 것을 방지합니다.

  • 방화벽 사용 : 서버 레벨에서 예외 연결을 제한합니다.

  • 로드 밸런싱 사용 : 요청 압력을 분산시킵니다.

  • 모니터링 로그 : 시간에 비정상적인 트래픽을 발견하십시오.

6. 결론

PHP 소켓 서버의 최대 연결 수를 제한하면 어느 정도의 DOS 공격에 효과적으로 저항하고 서버 리소스의 악의적 인 고갈을 피할 수 있습니다. 다른 보안 조치와 결합하여 서버를보다 확실하게 보호하고 안정적인 서비스 운영을 보장 할 수 있습니다.