ホームページ >データベース >mysql チュートリアル >MySQL と Java でプリペアド ステートメントを使用して動的な列名を持つデータを取得するにはどうすればよいですか?
準備されたステートメントを使用した MySQL および Java での動的カラム名の取得: より安全なアプローチ
多くの MySQL および Java 開発者は、準備されたステートメントを使用して、動的に生成された列名を持つデータを取得することを検討してきました。 ただし、準備されたステートメントのパラメーターに列名を直接置換することはサポートされておらず、重大なセキュリティ リスクが生じます。 通常、データベース スキーマの再設計が最善の解決策です。
次に示すように、この方法で準備されたステートメントを使用しようとすると、エラーが発生します。
<code class="language-java">String columnNames = "d,e,f"; String query = "SELECT a,b,c,?" + " FROM " + name + " WHERE d=?"; // This results in "SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'", not the desired result.</code>
クエリは、?
プレースホルダーを列名ではなく文字列リテラルとして扱います。
SQL インジェクションの脆弱性を回避するために、より堅牢な方法として、データベース自体に動的列名を保存する方法があります。 次の列を含む「user_data」のようなテーブルを考えてみましょう:
id
(主キー)user_name
column_names
(カンマで区切られた列名の文字列)このテーブルから取得した column_names
を連結することで SQL クエリを構築できます。
<code class="language-java">String query = "SELECT a,b,c," + columnNames + " FROM " + name + " WHERE d=?";</code>
このアプローチにより、列名がインジェクション攻撃の影響を受けやすいパラメーターとして扱われないことが保証されます。 文字列の連結を使用しますが、脆弱な部分 (列名) はデータベースから取得されることですでにサニタイズされています。クエリの構築に使用されるユーザー指定のデータは、SQL ステートメントの直接の一部ではない場合でも、必ずサニタイズしてください。 この改訂されたアプローチは、動的な列名を処理するための、より安全で管理しやすいソリューションを提供します。
以上がMySQL と Java でプリペアド ステートメントを使用して動的な列名を持つデータを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。