Bei der Verwendung von PHP-Netzwerkprogrammierschnittstellen von PHP ist die Funktion Socket_accecece () ein wichtiger Schritt bei der Behandlung eingehender Verbindungen. Es wird normalerweise in Verbindung mit Funktionen wie Socket_Create () , Socket_Bind () und Socket_Listen () verwendet, um einen serverseitigen Socket zu erstellen. Obwohl dieser Prozess sehr einfach ist, ist er auch voller Sicherheitsrisiken. Insbesondere nach Annahme von Kundenverbindungen ist es sehr einfach, unter illegalen Datenspritzangriffen zu leiden.
In diesem Artikel werden verschiedene wirksame Möglichkeiten eingeführt, um illegale Dateninjektion bei der Verwendung von Socket_accept () zu verhindern.
Stellen Sie beim Lesen von Daten, die vom Client mit Socket_Read () gesendet werden, die maximale Leselänge fest, um den Überlauf von Puffer oder übermäßige Datenpakete zu verhindern:
$buffer = socket_read($clientSocket, 2048, PHP_NORMAL_READ);
Die maximale Leselänge wird auf 2048 Bytes eingestellt. Wenn der Kunde versucht, Daten zu senden, die diese Länge überschreiten, wird diese automatisch abgeschnitten, wodurch das Risiko einer Dateneinspritzung verringert wird.
Nach dem Lesen der Daten sollte sofort die illegale Zeichenbeschachtelung durchgeführt werden. Es wird empfohlen, regelmäßige Ausdrücke oder PHP-integrierte Filterfunktionen zu verwenden, um Daten zu verarbeiten. Zum Beispiel:
$input = trim($buffer);
if (!preg_match('/^[a-zA-Z0-9\s]+$/', $input)) {
socket_write($clientSocket, "Illegale Eingabe!\n");
socket_close($clientSocket);
exit;
}
Diese Methode kann Daten mit Steuerzeichen, speziellen Symbolen oder böswilligen Befehlen effektiv verhindern, die weiter verarbeitet werden.
Wenn der Server und der Client über ein benutzerdefiniertes Protokoll kommunizieren, stellen Sie sicher, dass Sie ein klares Nachrichtenformat und eine klare Nachricht entwerfen. Um ein einfaches Beispiel zu geben, kann angegeben werden, dass der Client ein Paket senden muss, das mit einem bestimmten Schlüsselwort beginnt:
if (strpos($input, 'CMD:') !== 0) {
socket_write($clientSocket, "Protokollformatfehler!\n");
socket_close($clientSocket);
exit;
}
Auf diese Weise können die ungültigsten oder böswilligen Anfragen auf Protokollebene blockiert werden.
Um zu verhindern, dass Kunden lange Zeit Verbindungen aufbewahren und kontinuierlich böswillige Daten senden, wird empfohlen, für jeden Sockel eine angemessene Zeitüberschreitung festzulegen:
socket_set_option($clientSocket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>5, "usec"=>0]);
Wenn der Client keine Daten innerhalb von 5 Sekunden sendet, wird der Server automatisch abgeschlossen. Dieser Ansatz kann potenzielle Denial -Denial -of -Service -Angriffe (DIS -Angriffe) effektiv abschwächen.
Für Kunden -IPs, die mehrmals illegale Daten senden, sollten Blockierungen oder vorübergehende Blockierungen in Betracht gezogen werden. Gleichzeitig ist die Aufzeichnung jedes illegalen Datenversuchs auch für die spätere Angriffsverfolgung und die politischen Anpassungen von entscheidender Bedeutung:
file_put_contents('logs/illegal_access.log', $_SERVER['REMOTE_ADDR'] . " - $input\n", FILE_APPEND);
Sie können Firewall -Regeln kombinieren, um die Quell -IP von böswilligen Anfragen automatisch zu blockieren.
Das Folgende ist eine grundlegende Implementierung des Socket -Servers, die die oben genannten Schutzmaßnahmen integriert:
$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, "Illegale Eingabe!\n");
file_put_contents('/var/log/socket_illegal.log', "Illegaler Zugangsversuch: $input\n", FILE_APPEND);
socket_close($clientSocket);
continue;
}
// Probenverarbeitungslogik
socket_write($clientSocket, "Willkommen zu Besuch m66.net Socket Aufschlag!\n");
socket_close($clientSocket);
}
Obwohl die Verwendung von Socket -Programmierungen direkt in PHP leistungsfähig ist, müssen Entwickler auch die Sicherheit der Datenkommunikation vollständig verstehen. Durch Begrenzung der Leselänge, die Überprüfung der Eingabedaten, das Definieren von Kommunikationsprotokollen, das Festlegen von Zeitüberschreitungen und das Aufzeichnungsprotokollen kann das Risiko einer illegalen Dateneinspritzung bei Verwendung von Socket_accept () erheblich reduziert werden.
Denken Sie immer daran: Jeder Datenbyte, der mit dem Kunden interagiert, kann ein potenzieller Angriffsvektor sein, und die Verteidigung beginnt mit der ersten Codezeile.