네트워크 프로그래밍에 PHP를 사용하는 경우 Socket_Accept ()는 클라이언트 연결을 수락하는 핵심 기능입니다. DOS (서비스 거부) 공격에 직면하여 공격자는 일반적으로 많은 수의 악의적 인 연결 요청을 사용하여 서버 리소스를 소진하여 서버가 정당한 사용자 요청에 대응할 수 없게합니다. 이 기사에서는 Socket_accept () 에서 허용되는 최대 연결 수를 제한하여 서버가 악의적으로 끌리는 것을 효과적으로 방지하는 방법을 설명합니다.
DOS 공격에서 공격자는 서버의 서버의 동시 연결을 채우는 많은 동시 연결을 생성하여 서버가 새로운 일반 요청을 처리 할 수 없게합니다. 최대 연결 수를 제한하고 서버가 리소스 권한 범위 내에서 특정 수의 클라이언트 연결 만 처리하는지 확인하면이 공격의 영향을 효과적으로 줄일 수 있습니다.
변수를 사용하여 현재 설정된 연결 수를 계산하십시오.
새 연결이 수신되면 현재 연결 번호가 한계를 초과하는지 여부가 결정됩니다.
한계가 초과 될 때 (새 연결을 닫음) 연결을 거부 하고 Socket_accept ()는 더 이상 처리하도록 호출되지 않습니다.
연결이 닫히면 연결 수를 정시로 줄입니다.
다음 코드는 최대 연결이 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점유
}
?>
현재 활성 연결 수를 기록하려면 $ currentNections를 사용하십시오.
최대 연결 수를 초과하지 않을 때만 새 연결을 받으려면 socket_accept ()를 호출하십시오.
새 연결이 생성 된 후 클라이언트 소켓을 $ 클라이언트 배열로 저장하고 차단 모드로 설정하십시오.
$ 클라이언트를 폴링하여 클라이언트 데이터를 읽고 응답 후 계속 듣습니다.
클라이언트가 Quit 명령을 분리하거나 보내는 경우 소켓을 닫고 연결 수를 줄입니다.
USLEEP ()를 사용하여 CPU 과잉 점유를 줄입니다.
시간 초과 설정 : 클라이언트 연결 유휴 시간을 감지하면 타임 아웃이 자동으로 분리됩니다.
단일 IP 연결 수 제한 : 단일 IP가 많은 연결을 제조하는 것을 방지합니다.
방화벽 사용 : 서버 레벨에서 예외 연결을 제한합니다.
로드 밸런싱 사용 : 요청 압력을 분산시킵니다.
모니터링 로그 : 시간에 비정상적인 트래픽을 발견하십시오.
PHP 소켓 서버의 최대 연결 수를 제한하면 어느 정도의 DOS 공격에 효과적으로 저항하고 서버 리소스의 악의적 인 고갈을 피할 수 있습니다. 다른 보안 조치와 결합하여 서버를보다 확실하게 보호하고 안정적인 서비스 운영을 보장 할 수 있습니다.