Wenn sich die Datenbankserver und der Anwendungsserver nicht auf demselben LAN befinden, können die Daten während der Übertragung eine Verbindung herstellen, wenn sich der Datenbankserver und der Anwendungsserver nicht auf demselben LAN befinden. Daher wird dringend empfohlen, SSL -verschlüsselte Verbindungen zu verwenden, um die Sicherheit der Datenübertragung zu gewährleisten.
<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">// aufstellenSSLverbinden</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>
Obwohl die Konfiguration von SSL -Zertifikaten eine gewisse Komplexität erhöht, kann sie die Sicherheit der Datenübertragung erheblich verbessern, insbesondere in Szenarien mit großem Datenverkehr.
Verwenden Sie für die Sicherheit der Datenbank das Datenbank -Root -Konto nicht, um direkt remote zu verbinden. Das Root -Konto hat die höchste Berechtigung für die Datenbank. Sobald es durchgesickert ist, kann der Hacker die Datenbank nach Belieben bedienen und irreparable Verluste verursachen.
Erstellen Sie einen Datenbankbenutzer mit begrenzten Berechtigungen und geben Sie dem Benutzer nur die erforderlichen Berechtigungen, z. B. nur auf eine bestimmte Datenbank oder Tabelle zugreifen. Hier ist ein Beispiel für die Erstellung eines Benutzers und die Erteilung von Berechtigungen:
<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>
Verwenden Sie dann diesen Benutzer in PHP für die Datenbankverbindung:
<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>
Durch die Erstellung von Aussagen können SQL -Injektionsangriffe nicht nur effektiv verhindern, sondern auch die Leistung von Datenbankabfragen verbessern, insbesondere wenn dieselbe Abfrageanweisung mehrmals ausgeführt wird. MySQL bietet eine leistungsstarke Unterstützung bei der Implementierung von Vorbereitungsanweisungen.
<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äsentiert den String -Typ</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>
Unter Verwendung der Vorbereitungsanweisung wird der Inhaltseingang des Benutzers nicht direkt in die SQL -Anweisung gespleißt, wodurch das Risiko einer SQL -Injektion effektiv vermieden wird.
Bei hoher Parallelität kann die häufige Erstellung und Zerstörung von Datenbankverbindungen die Leistung der Anwendung erheblich beeinflussen. Um die Effizienz von Datenbankverbindungen zu verbessern, wird empfohlen, einen Datenbankverbindungspool zu verwenden. Obwohl MySQLI keine Verbindungs-Pooling-Funktionen selbst bereitstellt, kann es mit Hilfe einiger Tools oder Frameworks wie PHP-FPM- und MySQLND- Treiber oder mit externen Verbindungs-Pooling-Diensten (z. B. ProxysQL) implementiert werden.
Über den Verbindungspool können Anwendungen vorhandene Verbindungen wiederverwenden und den Aufwand der häufigen Verbindungseinrichtung verringern.
Um die Sicherheit der Datenbank zu erhöhen, kann auf dem Datenbankserver eine Firewall konfiguriert werden, um nur Verbindungen von einer bestimmten IP zu ermöglichen. Vermeiden Sie es in Produktionsumgebungen, dass eine IP -Adresse eine Verbindung zur Datenbank herstellt.
In MySQL kann der IP -Zugriff über den folgenden SQL -Befehl eingeschränkt werden:
<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>
Stellen Sie sicher, dass Web_User nur eine Verbindung über die angegebene IP -Adresse herstellt.
In hohen Latenz- oder instabilen Netzwerkumgebungen können Sie Zeitüberschreitungsfragen haben, wenn Sie eine Verbindung zur Datenbank herstellen. Wenn keine angemessene Zeitlimit festgelegt ist, kann die Verbindungsanfrage hängen, was die Antwortzeit der Anwendung beeinträchtigt.
MySQL unterstützt das Einstellen von Verbindungszeitlimiten, um nicht mehr reagierende Verbindungen zu vermeiden, die die Systemressourcen für lange Zeit besetzen:
<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">// aufstellenverbinden超时为5Zweite</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>
Verwenden Sie keine Auswahl *, um alle Felder abzufragen, wenn Sie mit einer Remote -Datenbank interagieren. Selbst wenn eine Verbindung zu einer lokalen Datenbank hergestellt wird, kann das Abfragen unnötiger Felder eine Bandbreite verschwenden, und die Netzwerklatenz der Remote -Datenbank ist offensichtlicher. Daher wird empfohlen, die für die Abfrage erforderlichen Felder zu klären, um unnötige Datenübertragungen zu reduzieren.
<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>
Wenn Ihre Anwendung große Mengen des Datenzugriffs behandeln muss, erwägen Sie die Datenbanklastausgleich und die Abtrennungstechniken des Schreibens. Durch die Trennung von Lesevorgängen von Schreibvorgängen und die Zuweisung von verschiedenen Datenbankinstanzen kann die Leistung und Verfügbarkeit des Systems effektiv verbessert werden.
Beispielsweise wird die Master -Datenbank für Schreibvorgänge und die Slave -Datenbank für Lesevorgänge verwendet. PHP kann entsprechende Datenbanken für die Verbindung gemäß verschiedenen Vorgängen auswählen.
Verwandte Tags:
mysqli