Lors de la programmation des réseaux utilisant PHP, SOCKET_SET_OPTION est une fonction très critique qui permet aux développeurs de définir diverses options pour que les sockets répondent à différents besoins de communication. Cependant, dans le développement réel, lorsque vous définissez des options de socket à l'aide de cette fonction, vous rencontrez souvent des erreurs liées à l'autorisation, en particulier pendant les environnements serveur ou le développement local. Cet article analyse ces erreurs d'autorisation courantes et fournit des solutions correspondantes.
C'est l'une des erreurs les plus courantes. Le code d'erreur [13] signifie «autorisation refusée», c'est-à-dire que l'autorisation est refusée. Cela se produit généralement lorsque vous essayez de définir certaines options de socket protégées par le système, telles que SO_BROADCAST ou SO_REUSEPORT .
Lorsque vous essayez de définir des options telles que IP_HDRINCL pour la prise d'origine, si le script n'a pas suffisamment d'autorisations (par exemple, ne pas fonctionner comme racine), il sera interdit par le système.
Dans les systèmes avec des modules de sécurité étroitement configurés tels que Selinux ou Apparmor, certaines options de socket peuvent ne pas être définies en raison des restrictions de stratégie.
L'exécution de PHP-FPM ou CLI en tant qu'utilisateur non privilégié : par défaut, les serveurs Web (tels que Nginx, Apache) ou les programmes CLI PHP s'exécutent généralement en tant qu'utilisateurs non-ROOT et échouent donc lorsque vous essayez de définir certaines options qui nécessitent des autorisations avancées.
Ligner à un port ou une adresse de diffusion restreinte : Lors de l'utilisation d'un port tel que SO_Broadcast ou contraignant à un port inférieur à 1024, le système d'exploitation peut empêcher les utilisateurs de non-racines d'utiliser.
Exécuter dans un environnement de conteneur Docker ou restreint : un programme PHP conteneurisé peut également rencontrer ces erreurs si les autorisations ne sont pas configurées correctement.
S'il est acceptable, il peut être résolu en augmentant les autorisations d'exécuter le script:
sudo php your_script.php
Ou configurez le service Web pour permettre aux utilisateurs spécifiques d'exécuter PHP avec des privilèges racine, mais cette pratique présente des risques de sécurité et n'est pas recommandé dans les environnements de production.
Pour les scripts CLI, vous pouvez configurer / etc.
username ALL=(ALL) NOPASSWD: /usr/bin/php /path/to/your_script.php
Pour les opérations de socket qui nécessitent l'envoi du paquet d'origine, vous pouvez donner à l'exécutable PHP les autorisations nécessaires:
sudo setcap cap_net_raw+ep /usr/bin/php
De cette façon, vous n'avez pas à exécuter l'intégralité du script PHP en tant que racine, mais vous pouvez toujours effectuer les opérations de socket requises.
Pour les systèmes avec Selinux ou Apparmor activés, vérifiez si la politique de sécurité bloque certaines opérations sur la prise. Vous pouvez vérifier les journaux Selinux en suivant la commande suivante:
sudo ausearch -m avc -ts recent
Pour Apparmor, vous devez afficher les journaux restreints pertinents dans / var / log / syslog .
Par exemple, ajustez le port de service au-dessus de 1024 pour éviter le besoin de permissions racines:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 12345); // Utilisation de ports sans privilégiés
Parfois, les paramètres de socket ne sont pas nécessaires, par exemple, SO_Broadcast n'est utilisé que pour la diffusion UDP, qui peut être complètement ignoré dans les connexions TCP:
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1); // Définir uniquement si c'est vraiment nécessaire
Lors du dépannage des erreurs liées à l'autorisation, il est recommandé d'activer la sortie du journal d'erreur détaillé:
error_reporting(E_ALL);
ini_set('display_errors', 1);
Et combiner les journaux système (tels que / var / log / syslog , /var/log/php-fpm.log ) pour obtenir plus d'informations de contexte.
De plus, vous pouvez aider à localiser les problèmes en ajoutant des informations de débogage à votre code:
if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
echo "Set option failed: " . socket_strerror(socket_last_error($socket)) . PHP_EOL;
}
Les erreurs d'autorisation courantes sont généralement causées par des autorisations système insuffisantes, des restrictions de stratégie de sécurité ou des paramètres de paramètres incorrects lors de l'utilisation de socket_set_option pour la configuration du socket. Ce type de problème peut être effectivement évité et résolu en améliorant les autorisations d'exécution, en configurant les politiques de sécurité du système ou en optimisant l'utilisation des prises.
Dans les environnements de production, essayez d'éviter d'utiliser des autorisations racinaires pour exécuter les scripts PHP, mais implémentez plutôt les fonctions nécessaires via un contrôle d'autorisation granulaire plus fin (tel que SETCAP ou configuration d'autorisation de l'utilisateur spécial) pour assurer un équilibre entre la sécurité et les fonctionnalités. Si vous souhaitez implémenter la communication de diffusion ou de liaison à bas port dans les projets réels, vous pouvez vous référer à l'exemple de code et à l'expérience pratique de https://gitbox.net/docs/php-socket-broadcast .