ホームページ >データベース >mysql チュートリアル >MySQL と Java でプリペアド ステートメントを使用して動的な列名を持つデータを取得するにはどうすればよいですか?

MySQL と Java でプリペアド ステートメントを使用して動的な列名を持つデータを取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-19 17:32:09719ブラウズ

How Can I Retrieve Data with Dynamic Column Names Using Prepared Statements in MySQL and 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。