PHP의 저수준 네트워크 프로그래밍 인터페이스를 사용하는 경우 Socket_accept () 함수는 인바운드 연결을 처리하는 데 중요한 단계입니다. 일반적으로 Socket_create () , Socket_bind () 및 Socket_listen () 과 같은 함수와 함께 서버 측 소켓을 빌드합니다. 이 과정은 매우 기본이지만 안전 위험도 가득합니다. 특히 클라이언트 연결을 수락 한 후 부적절하게 처리되면 불법 데이터 주입 공격으로 어려움을 겪는 것은 매우 쉽습니다.
이 기사는 socket_accept ()를 사용할 때 불법 데이터 주입을 방지하는 몇 가지 효과적인 방법을 소개합니다.
socket_read ()를 사용하여 클라이언트가 보낸 데이터를 읽을 때 버퍼 오버플로 또는 과도한 데이터 패킷을 방지하기 위해 최대 읽기 길이를 설정하십시오.
$buffer = socket_read($clientSocket, 2048, PHP_NORMAL_READ);
최대 읽기 길이는 2048 바이트로 설정됩니다. 클라이언트 가이 길이를 초과하는 데이터를 보내려고하면 자동으로 자르면 데이터 주입의 위험이 줄어 듭니다.
데이터를 읽은 후 형식 체크섬 불법 문자 필터링을 즉시 수행해야합니다. 데이터를 처리하기 위해 일반 표현식 또는 PHP 내장 필터링 기능을 사용하는 것이 좋습니다. 예를 들어:
$input = trim($buffer);
if (!preg_match('/^[a-zA-Z0-9\s]+$/', $input)) {
socket_write($clientSocket, "불법 입력!\n");
socket_close($clientSocket);
exit;
}
이 방법은 제어 문자, 특수 기호 또는 악의적 인 명령이 추가로 처리되는 것을 효과적으로 방지 할 수 있습니다.
서버와 클라이언트가 사용자 정의 프로토콜을 통해 통신하는 경우 명확한 메시지 형식과 경계를 설계하십시오. 간단한 예를 들기 위해 클라이언트가 특정 키워드로 시작하는 패킷을 보내야한다는 것을 지정할 수 있습니다.
if (strpos($input, 'CMD:') !== 0) {
socket_write($clientSocket, "프로토콜 형식 오류!\n");
socket_close($clientSocket);
exit;
}
이러한 방식으로, 가장 유효하지 않거나 악의적 인 요청은 프로토콜 수준에서 차단 될 수 있습니다.
클라이언트가 오랫동안 연결을 유지하고 악성 데이터를 지속적으로 전송하는 것을 방지하려면 각 소켓에 대해 합리적인 시간 초과를 설정하는 것이 좋습니다.
socket_set_option($clientSocket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>5, "usec"=>0]);
클라이언트가 5 초 이내에 데이터를 보내지 않으면 서버는 자동으로 연결이 끊어집니다. 이 접근법은 잠재적 인 서비스 거부 (DOS) 공격을 효과적으로 완화 할 수 있습니다.
불법 데이터를 여러 번 보내는 클라이언트 IP의 경우 차단 또는 임시 차단을 고려해야합니다. 동시에, 각 불법 데이터 시도를 기록하는 것은 나중에 공격 추적 및 정책 조정에도 중요합니다.
file_put_contents('logs/illegal_access.log', $_SERVER['REMOTE_ADDR'] . " - $input\n", FILE_APPEND);
방화벽 규칙을 결합하여 악성 요청의 소스 IP를 자동으로 차단할 수 있습니다.
다음은 위의 보호 측정을 통합하는 기본 소켓 서버 구현입니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 12345);
socket_listen($socket);
while (true) {
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
continue;
}
socket_set_option($clientSocket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>5, "usec"=>0]);
$buffer = socket_read($clientSocket, 2048, PHP_NORMAL_READ);
$input = trim($buffer);
if (!preg_match('/^[a-zA-Z0-9\s]+$/', $input)) {
socket_write($clientSocket, "불법 입력!\n");
file_put_contents('/var/log/socket_illegal.log', "불법 액세스 시도: $input\n", FILE_APPEND);
socket_close($clientSocket);
continue;
}
// 샘플 처리 로직
socket_write($clientSocket, "방문에 오신 것을 환영합니다 m66.net Socket 제공하다!\n");
socket_close($clientSocket);
}
PHP에서 직접 소켓 프로그래밍을 사용하는 것은 강력하지만 개발자는 데이터 커뮤니케이션 보안을 완전히 이해해야합니다. 읽기 길이를 제한, 입력 데이터를 확인하고, 통신 프로토콜 정의, 시간 초과 설정 및 녹음 로그를 설정하면, socket_accept ()를 사용할 때 불법 데이터 주입의 위험을 크게 줄일 수 있습니다.
항상 기억하십시오 : 클라이언트와 상호 작용하는 모든 바이트는 잠재적 인 공격 벡터가 될 수 있으며 방어는 첫 번째 코드로 시작합니다.