ホームページ >Java >&#&チュートリアル >Java のプリペアド ステートメントは MySQL で変数カラム名を安全に処理できますか?

Java のプリペアド ステートメントは MySQL で変数カラム名を安全に処理できますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-06 20:09:12278ブラウズ

Can Prepared Statements in Java Handle Variable Column Names Securely in MySQL?

準備済みステートメントを使用した変数列名

問題:

変数列名を指定できますかSQL インジェクションを防ぐために Java を使用して MySQL でプリペアド ステートメントを使用する場合脆弱性?

説明:

プリペアド ステートメントは、クエリ パラメータをメインのクエリ ステートメントから分離することで SQL インジェクションから保護するように設計されています。準備されたステートメントを使用しようとすると、列名はパラメーターとして認識されず、代わりにリテラル値としてクエリに挿入されます。指定された列名が適切にサニタイズされていない場合、セキュリティの問題が発生する可能性があります。

解決策:

  • 動的列名を避ける:ユーザー指定の列名を不要にするためにデータベース スキーマを再設計することをお勧めします。代わりに、目的の列名を保存するための別の列を作成し、それらをクエリに含めることを検討してください。
  • 手動クエリの構築とサニタイズ: 動的な列名が避けられない場合は、次のことを行う必要があります。 SQL クエリ文字列を自分で構築します。 String#replace() メソッドを使用して、列名に埋め込まれた引用符をエスケープし、SQL インジェクションを防ぎます。例:
// Sanitize the user-provided column names
String sanitizedColumns = columnNames.replace("'", "\'");

// Build the SQL query string
String query = "SELECT a,b,c,ROW_NUMBER() OVER(), " + sanitizedColumns + " FROM " + name + " WHERE d=?";

// Prepare the statement
stmt = conn.prepareStatement(query);
stmt.setString(1, "x");

以上がJava のプリペアド ステートメントは MySQL で変数カラム名を安全に処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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