Bei Verwendung von PHP für die Netzwerkprogrammierung ist Socket_accept () die Kernfunktion, die Client -Verbindungen akzeptiert. Angesichts von DOS -Angriffen (Denial of Service) verwenden Angreifer in der Regel eine große Anzahl böswilliger Verbindungsanfragen, die die Serverressourcen anstrengen, wodurch der Server nicht auf legitime Benutzeranfragen reagieren kann. In diesem Artikel wird erläutert, wie der Server effektiv daran hindert, böswillig abgeschleppt zu werden, indem die maximale Anzahl von Verbindungen begrenzt wird, die von Socket_accept () akzeptiert werden.
Bei DOS -Angriffen erstellt ein Angreifer eine große Anzahl von gleichzeitigen Verbindungen, die die gleichzeitigen Verbindungen des Servers füllen, wodurch der Server keine neuen normalen Anforderungen verarbeitet. Wenn Sie die maximale Anzahl von Verbindungen einschränken und sicherstellen, dass der Server nur eine bestimmte Anzahl von Client -Verbindungen innerhalb des Ressourcenberechtigungsbereichs verarbeitet, kann die Auswirkungen dieses Angriffs effektiv verringert werden.
Verwenden Sie Variablen, um die Anzahl der derzeit festgelegten Verbindungen zu zählen.
Wenn eine neue Verbindung empfangen wird, wird festgestellt, ob die aktuelle Verbindungsnummer die Grenze überschreitet.
Lehnen Sie die Verbindung ab, wenn die Grenze überschritten wird (schließen Sie die neue Verbindung), und Socket_accept () wird nicht mehr zur Verarbeitung aufgerufen.
Wenn die Verbindung geschlossen ist, reduzieren Sie die Anschlusszahl rechtzeitig.
Der folgende Code zeigt, wie ein maximales Verbindungsgrenze basierend auf Socket_accept () in PHP implementiert wird, vorausgesetzt, die maximale Verbindung beträgt 100:
<?php
set_time_limit(0);
error_reporting(E_ALL);
$address = '0.0.0.0';
$port = 12345;
$maxConnections = 100;
$currentConnections = 0;
// erstellen TCP Socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port) or die('Bindung fehlgeschlagen');
socket_listen($sock);
echo "Serverstart,Monitor {$address}:{$port}\n";
$clients = [];
while (true) {
// Bestimmen Sie, ob die maximale Anzahl von Verbindungen überschritten wird
if ($currentConnections < $maxConnections) {
// Der Nicht-Blocking-Modus akzeptiert neue Verbindungen
socket_set_nonblock($sock);
$client = @socket_accept($sock);
if ($client !== false) {
// Neue Verbindung war erfolgreich,Zählen eins
$currentConnections++;
$clients[] = $client;
// Einrichten des KundensocketNicht blockieren
socket_set_nonblock($client);
echo "Neue Client -Verbindung,Aktuelle Verbindungsnummer: $currentConnections\n";
}
} else {
// Die maximale Anzahl von Verbindungen überschritten überschritten,Neue Verbindung ablehnen(Optionale Wartezeit)
usleep(100000); // 100ms
}
// Umfragen zur Verarbeitung von Daten von verbundenen Clients
foreach ($clients as $key => $clientSocket) {
$data = @socket_read($clientSocket, 2048, PHP_NORMAL_READ);
if ($data === false) {
// Trennung,Client entfernen
socket_close($clientSocket);
unset($clients[$key]);
$currentConnections--;
echo "Kunden getrennt,Aktuelle Verbindungsnummer: $currentConnections\n";
continue;
} elseif ($data !== '') {
$data = trim($data);
if ($data === 'quit') {
// Der Kunde trennt aktiv die Verbindung
socket_close($clientSocket);
unset($clients[$key]);
$currentConnections--;
echo "Der Kunde wird aktiv getrennt,Aktuelle Verbindungsnummer: $currentConnections\n";
continue;
}
// Verarbeitungsdaten vom Client gesendet
$response = "Server empfangen: {$data}\n";
socket_write($clientSocket, $response, strlen($response));
}
}
usleep(50000); // reduzierenCPUBelegung
}
?>
Verwenden Sie $ CurrentConnections , um die aktuelle Anzahl der aktiven Verbindungen aufzuzeichnen.
Rufen Sie Socket_accept () auf, um neue Verbindungen zu erhalten, wenn die maximale Anzahl von Verbindungen nicht überschritten wird.
Speichern Sie nach dem Erstellen der neuen Verbindung den Client-Socket im $ Client- Array und setzen Sie sich auf den nicht blockierenden Modus ein.
Lesen Sie die Kundendaten durch, indem Sie die Kundendaten befragen und nach der Antwort weiterzuhören.
Wenn der Client einen Befehlsbefehl abnimmt oder sendet, schließen Sie den Socket und reduzieren Sie die Verbindungszahl.
Verwenden Sie Usleep () , um die CPU-Übereinsatzung zu reduzieren.
Timeout festlegen : Erkennen Sie die Leerlaufzeit der Clientverbindung, und das Timeout wird automatisch getrennt.
Begrenzen Sie die Anzahl der einzelnen IP -Verbindungen : Verhindern Sie, dass ein einzelnes IP eine große Anzahl von Verbindungen herstellt.
Verwenden von Firewall : Begrenzen Sie Ausnahmeverbindungen auf Serverebene.
Verwenden Sie Lastausgleich : Streit fordern Druck.
Überwachungsprotokoll : Entdecken Sie den abnormalen Verkehr rechtzeitig.
Durch die Begrenzung der maximalen Anzahl von Verbindungen auf dem PHP -Socket -Server können Sie einem bestimmten Grad an DOS -Angriffen effektiv widerstehen und eine böswillige Erschöpfung der Serverressourcen vermeiden. In Kombination mit anderen Sicherheitsmaßnahmen kann der Server einen soliden Schutz bieten und den stabilen Betrieb von Diensten sicherstellen.