PHPを使用してソケットベースのサーバープログラムを作成するとき、 socket_accept()はクライアント接続を受け入れる重要な関数です。この機能は非常に実用的ですが、アクセス制御機能はありません。サービスを特定のIPアドレスのみを接続できるようにする場合は、IPホワイトリストフィルタリングメカニズムを自分で実装する必要があります。
この記事では、Socket_accept()を使用してIPホワイトリスト機能をサービスに追加する方法を詳細に紹介し、サービスのセキュリティと制御機能を改善します。
まず、 socket_accept()を使用して典型的な基本ソケットサービス構造を見てみましょう。
$host = '0.0.0.0';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "サーバーが開始されます,ポートを聞いてください $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
// ここに追加します IP ホワイトリストフィルタリングロジック
}
デフォルトでは、上記のコードは、すべてのクライアントからの接続要求を無制限に受け入れます。 IPホワイトリストコントロールに参加するには、 socket_getPeername()を使用して、 socket_accept()後にクライアントIPを取得し、IPがホワイトリストにあるかどうかを判断する必要があります。
以下は修正されたコードで、単純なホワイトリストメカニズムを追加します。
$host = '0.0.0.0';
$port = 12345;
// IP ホワイトリスト
$whitelist = [
'192.168.1.100',
'203.0.113.45',
'198.51.100.23'
];
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "サーバーが開始されます,ポートを聞いてください $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
continue;
}
socket_getpeername($clientSocket, $clientIp);
if (!in_array($clientIp, $whitelist)) {
echo "拒否 $clientIp 繋がり。\n";
socket_close($clientSocket);
continue;
}
echo "から受け入れられます $clientIp 繋がり。\n";
// クライアントリクエストロジックはここで処理されます
$welcomeMsg = "訪問してください m66.net サービス。\n";
socket_write($clientSocket, $welcomeMsg, strlen($welcomeMsg));
socket_close($clientSocket);
}
socket_getPeername() :この関数は、接続されたクライアントのIPアドレスを取得するために使用されます。
ホワイトリストアレイ:アクセスを許可するIPアドレスを$ホワイトリストアレイに配置できます。
接続制御:ホワイトリストに載っていないIPSの場合、 Socket_Close()を使用して切断します。
コードのハードコードホワイトリストには推奨されず、実際の展開中にデータベースまたは構成ファイルから動的にロードできます。
違法な接続の試みを追跡するために、ロギング関数の追加を検討できます。
socket_accept()後にIPホワイトリストの検証ロジックを追加することにより、不正アクセスを効果的に制限し、PHPソケットサービスのセキュリティを改善できます。上記の例は、CIDR範囲の追加、IPv6アドレスをサポートするなど、実際のニーズに応じて開発者が拡張できる最も基本的な実装方法を示しています。
外の世界にサービスを提供するPHPソケットプログラムを構築するときは、「防衛の第一線」を維持し、信頼できないクライアントがシステムに簡単にアクセスできるようにしないようにしてください。この記事があなたに役立つことを願っています!