現在の位置: ホーム> 最新記事一覧> mysqliを使用してリモートデータベースに接続する際に注意する必要があるセキュリティとパフォーマンスの問題

mysqliを使用してリモートデータベースに接続する際に注意する必要があるセキュリティとパフォーマンスの問題

gitbox 2025-06-19

1。SSLを使用して接続を暗号化します

リモートデータベースに接続する場合、データベースサーバーとアプリケーションサーバーが同じLAN上にない場合、送信中にデータが傍受または改ざんされる場合があります。したがって、SSL暗号化された接続を使用して、データ送信のセキュリティを確保することを強くお勧めします。

実装方法:

 <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">// 設定SSL接続する</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</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>-&gt;</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>

SSL証明書の構成は複雑さを増加させますが、特にデータトラフィックが多いシナリオでは、データ送信のセキュリティを大幅に改善できます。


2。ルートアカウントを使用してデータベースに接続しないでください

データベースのセキュリティの場合、データベースルートアカウントを使用してリモートで直接接続しないでください。ルートアカウントは、データベースに対して最も高い権限を持っています。漏れたら、ハッカーはデータベースを自由に操作し、取り返しのつかない損失を引き起こすことができます。

実装方法:

限られた権限を持つデータベースユーザーを作成し、特定のデータベースまたはテーブルのみにアクセスするなど、ユーザーに必要な権限のみを提供します。ユーザーを作成して許可を付与する例は次のとおりです。

 <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>

次に、データベース接続にそのユーザーをPHPで使用します。

 <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>

3。準備されたステートメントを使用します

ステートメントの準備は、SQLインジェクション攻撃を効果的に防止するだけでなく、特に同じクエリステートメントが複数回実行される場合、データベースクエリのパフォーマンスを改善することもできます。 MySQLは、準備ステートメントを実装するための強力なサポートを提供します。

例:

 <span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</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>-&gt;</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"文字列タイプを表します</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>-&gt;</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>-&gt;</span><span><span class="hljs-title function_ invoke__">get_result</span></span><span>();
</span></span>

準備ステートメントを使用して、ユーザーによるコンテンツ入力はSQLステートメントに直接スプライスされないため、SQL注入のリスクを効果的に回避します。


4.データベース接続プールの使用

高い並行性の場合、データベース接続の頻繁な作成と破壊は、アプリケーションのパフォーマンスに大きな影響を与える可能性があります。データベース接続の効率を向上させるには、データベース接続プールを使用することをお勧めします。 MySQLIは接続プーリング機能自体を提供していませんが、 PHP-FPMMySQLNDドライバーなどのいくつかのツールやフレームワーク、または外部接続プーリングサービス(ProxySQLなど)を使用して実装できます。

接続プールを介して、アプリケーションは既存の接続を再利用して、頻繁な接続確立のオーバーヘッドを減らすことができます。


5。ファイアウォールとIPホワイトリスト

データベースのセキュリティを増やすために、特定のIPからの接続のみを許可するように、データベースサーバーでファイアウォールを構成できます。特に生産環境では、IPアドレスがデータベースに接続することを許可しないでください。

構成方法:

MySQLでは、次のSQLコマンドを介してIPアクセスを制限できます。

 <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>

Web_Userが指定されたIPアドレスからのみ接続することを確認してください。


6.適切な接続タイムアウトを設定します

高いレイテンシまたは不安定なネットワーク環境では、データベースに接続するときにタイムアウトの問題が発生する可能性があります。合理的なタイムアウトが設定されていない場合、接続要求がハングアップし、アプリケーションの応答時間に影響を与える可能性があります。

MySQLは、システムリソースを長時間占有する無反応の接続を避けるために、接続タイムアウトの設定をサポートしています。

 <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>-&gt;</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">// 設定接続する超时为52番</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</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>

7.オンデマンドでフィールドをクエリします

リモートデータベースと対話するときに、 Select *を使用してすべてのフィールドをクエリしないでください。ローカルデータベースに接続する場合でも、不要なフィールドを照会すると帯域幅が無駄になる可能性があり、リモートデータベースのネットワーク遅延がより明白です。したがって、不必要なデータ転送を減らすためにクエリに必要なフィールドを明確にすることをお勧めします。

例:

 <span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</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>

8。データベースの負荷分散と読み取りワイトの分離

アプリケーションが大量のデータアクセスを処理する必要がある場合は、データベースのロードバランスと読み取りワイト分離技術の使用を検討してください。読み取り操作を書き込み操作から分離し、それらをさまざまなデータベースインスタンスに割り当てることにより、システムのパフォーマンスと可用性を効果的に改善できます。

たとえば、マスターデータベースは書き込み操作に使用され、スレーブデータベースは読み取り操作に使用されます。 PHPは、異なる操作に応じて、接続用に対応するデータベースを選択できます。