Lors de la connexion à une base de données distante, si le serveur de base de données et le serveur d'applications ne sont pas sur le même LAN, les données peuvent être interceptées ou falsifiées pendant la transmission. Par conséquent, il est fortement recommandé d'utiliser des connexions cryptées SSL pour assurer la sécurité de la transmission des données.
<span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">'remote_host'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>, </span><span><span class="hljs-string">'database'</span></span><span>, </span><span><span class="hljs-number">3306</span></span><span>);
</span><span><span class="hljs-comment">// installationSSLconnecter</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">ssl_set</span></span><span>(</span><span><span class="hljs-literal">NULL</span></span><span>, </span><span><span class="hljs-literal">NULL</span></span><span>, </span><span><span class="hljs-string">'/path/to/client-cert.pem'</span></span><span>, </span><span><span class="hljs-string">'/path/to/client-key.pem'</span></span><span>, </span><span><span class="hljs-string">'/path/to/ca-cert.pem'</span></span><span>);
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">real_connect</span></span><span>(</span><span><span class="hljs-string">'remote_host'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>, </span><span><span class="hljs-string">'database'</span></span><span>);
</span></span>
Bien que la configuration des certificats SSL augmente une certaine complexité, elle peut considérablement améliorer la sécurité de la transmission des données, en particulier dans les scénarios avec un grand trafic de données.
Pour la sécurité de la base de données, n'utilisez pas le compte racine de la base de données pour se connecter directement à distance. Le compte racine a la plus haute autorité de la base de données. Une fois qu'il est divulgué, le pirate peut faire fonctionner la base de données à volonté, provoquant des pertes irréparables.
Créez un utilisateur de la base de données avec des autorisations limitées et donnez à l'utilisateur uniquement les autorisations nécessaires, telles que l'accès à une base de données ou à une table spécifique. Voici un exemple de création d'un utilisateur et d'octroi d'autorisations:
<span><span><span class="hljs-keyword">CREATE</span></span><span> </span><span><span class="hljs-keyword">USER</span></span><span> </span><span><span class="hljs-string">'web_user'</span></span><span>@</span><span><span class="hljs-string">'%'</span></span><span> IDENTIFIED </span><span><span class="hljs-keyword">BY</span></span><span> </span><span><span class="hljs-string">'secure_password'</span></span><span>;
</span><span><span class="hljs-keyword">GRANT</span></span><span> </span><span><span class="hljs-keyword">SELECT</span></span><span>, </span><span><span class="hljs-keyword">INSERT</span></span><span>, </span><span><span class="hljs-keyword">UPDATE</span></span><span> </span><span><span class="hljs-keyword">ON</span></span><span> your_database.</span><span><span class="hljs-operator">*</span></span><span> </span><span><span class="hljs-keyword">TO</span></span><span> </span><span><span class="hljs-string">'web_user'</span></span><span>@</span><span><span class="hljs-string">'%'</span></span><span>;
</span></span>
Ensuite, utilisez cet utilisateur dans PHP pour la connexion de la base de données:
<span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">'remote_host'</span></span><span>, </span><span><span class="hljs-string">'web_user'</span></span><span>, </span><span><span class="hljs-string">'secure_password'</span></span><span>, </span><span><span class="hljs-string">'database'</span></span><span>);
</span></span>
La préparation des instructions peut non seulement empêcher efficacement les attaques d'injection SQL, mais également améliorer les performances des requêtes de base de données, en particulier lorsque la même instruction de requête est exécutée plusieurs fois. MySQL fournit un support puissant pour mettre en œuvre des instructions de préparation.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE email = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>); </span><span><span class="hljs-comment">// "s"Représente le type de chaîne</span></span><span>
</span><span><span class="hljs-variable">$email</span></span><span> = </span><span><span class="hljs-string">'[email protected]'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">get_result</span></span><span>();
</span></span>
En utilisant l'instruction de préparation, l'entrée de contenu par l'utilisateur ne sera pas épissé directement dans l'instruction SQL, ce qui évite efficacement le risque d'injection SQL.
Dans le cas d'une concurrence élevée, la création et la destruction fréquentes des connexions de la base de données peuvent considérablement affecter les performances de l'application. Pour améliorer l'efficacité des connexions de la base de données, il est recommandé d'utiliser un pool de connexions de base de données. Bien que MySQLI ne fournit pas de fonctionnalité de regroupement de connexions lui-même, il peut être implémenté à l'aide de certains outils ou de frameworks, tels que PHP-FPM et MySQLND , ou en utilisant des services de pool de connexion externes (tels que ProxySQL).
Grâce au pool de connexions, les applications peuvent réutiliser les connexions existantes, en réduisant les frais généraux de l'établissement de connexions fréquentes.
Pour augmenter la sécurité de la base de données, un pare-feu peut être configuré sur le serveur de base de données pour autoriser uniquement les connexions à partir d'une adresse IP spécifique. En particulier dans les environnements de production, évitez de permettre à toute adresse IP de se connecter à la base de données.
Dans MySQL, l'accès IP peut être restreint via la commande SQL suivante:
<span><span><span class="hljs-keyword">GRANT</span></span><span> </span><span><span class="hljs-keyword">ALL</span></span><span> PRIVILEGES </span><span><span class="hljs-keyword">ON</span></span><span> your_database.</span><span><span class="hljs-operator">*</span></span><span> </span><span><span class="hljs-keyword">TO</span></span><span> </span><span><span class="hljs-string">'web_user'</span></span><span>@</span><span><span class="hljs-string">'192.168.1.100'</span></span><span>;
</span></span>
Assurez-vous que Web_user se connecte uniquement à partir de l'adresse IP spécifiée.
Dans les environnements réseau élevés ou réseau instables, vous pouvez rencontrer des problèmes de délai d'expiration lors de la connexion à la base de données. Si un délai d'expiration raisonnable n'est pas défini, il peut faire accrocher la demande de connexion, affectant le temps de réponse de l'application.
MySQL prend en charge la définition du délai d'expiration des connexions pour éviter les connexions insensibles occupant les ressources du système pendant longtemps:
<span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">options</span></span><span>(MYSQLI_OPT_CONNECT_TIMEOUT, </span><span><span class="hljs-number">5</span></span><span>); </span><span><span class="hljs-comment">// installationconnecter超时为5Deuxième</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">real_connect</span></span><span>(</span><span><span class="hljs-string">'remote_host'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>, </span><span><span class="hljs-string">'database'</span></span><span>);
</span></span>
N'utilisez pas SELECT * pour interroger tous les champs lors de l'interaction avec une base de données distante. Même lors de la connexion à une base de données locale, l'interrogation de champs inutiles peut gaspiller la bande passante, et la latence du réseau de la base de données distante est plus évidente. Par conséquent, il est recommandé de clarifier les champs nécessaires à la requête pour réduire les transferts de données inutiles.
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name FROM users WHERE status = 'active'"</span></span><span>);
</span></span>
Si votre application doit gérer de grandes quantités d'accès aux données, envisagez d'utiliser l'équilibrage de la charge de données et les techniques de séparation en lecture-écriture. En séparant les opérations de lecture des opérations d'écriture et en les attribuant à différentes instances de base de données, les performances et la disponibilité du système peuvent être efficacement améliorées.
Par exemple, la base de données maître est utilisée pour les opérations d'écriture et la base de données des esclaves est utilisée pour les opérations de lecture. PHP peut sélectionner des bases de données correspondantes pour la connexion en fonction des différentes opérations.
Étiquettes associées:
mysqli