ホームページ >データベース >mysql チュートリアル >SQL インジェクションを防ぐために Android SQL クエリの IN 句を安全にパラメータ化するにはどうすればよいですか?
安全なパラメータ化された IN 句
Android 開発では、SQL クエリに動的パラメーターを使用した IN 句が含まれるのが一般的です。ただし、パラメーターをクエリに直接置き換えると、セキュリティが侵害され、SQL インジェクションの脆弱性が発生する可能性があります。
チャレンジ
課題は、データの整合性を損なうことなく、IN 句を安全にパラメータ化することです。パラメータ値を手動でクエリに連結することは安全ではなく、悪意のある SQL コマンドの誤った実行を防ぐというパラメータ バインディングの目的を損なうことになります。
解決策: 動的な疑問符
安全な解決策には、疑問符のカンマ区切り文字列を動的に生成することが含まれます。この文字列は元の SQL クエリに直接埋め込むことができ、プレースホルダーの数が指定されたパラメーターの数と確実に一致するようにします。仕組みは次のとおりです:
プレースホルダー ジェネレーターを作成します:
必要な数のプレースホルダーを受け入れ、その数の疑問符 (カンマで区切られた) を含む文字列を返す関数 makePlaceholders(int len)
を実装します。
パラメータ化されたクエリの構築: 生成された IN 句の疑問符文字列を使用して SQL クエリを作成します:
<code>String query = "SELECT * FROM table WHERE name IN (" + makePlaceholders(names.length) + ")";</code>
パラメータを指定して実行: 最後に、パラメーター バインディング メソッドを使用してクエリが実行され、適切な値がパラメーターとして提供されます。
実装例
次に、makePlaceholders
関数の実装例を示します。
<code class="language-java">String makePlaceholders(int len) { if (len < 1) { throw new IllegalArgumentException("Length must be at least 1"); } StringBuilder sb = new StringBuilder(len * 2 - 1); sb.append("?"); for (int i = 1; i < len; i++) { sb.append(",?"); } return sb.toString(); }</code>
この手法を使用すると、IN 句を安全にパラメータ化できるため、SQL インジェクションのリスクが軽減され、データベース操作の整合性が確保されます。
以上がSQL インジェクションを防ぐために Android SQL クエリの IN 句を安全にパラメータ化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。