Mybatisで動的なテーブル名のSQLインジェクション対策方法は何ですか。
MyBatisは、動的なテーブル名のインジェクションを防ぐ方法を提供しており、動的SQLとパラメーター置換を使用して実現できます。
- もし
- どちらを選びますか?
- いつ
- それ以外の場合
<select id="selectUserById" resultType="User">
SELECT * FROM
<choose>
<when test="tableType == 'A'">
table_A
</when>
<when test="tableType == 'B'">
table_B
</when>
<otherwise>
table_C
</otherwise>
</choose>
WHERE id = #{id}
</select>
- SQL文にテーブル名をパラメータとして渡すことで、インジェクションを防ぐ方法。例えば:
<select id="selectUserById" resultType="User">
SELECT * FROM #{tableName}
WHERE id = #{id}
</select>
Javaのコード内で、テーブル名をMyBatisのメソッドに引数として渡す。
String tableName = "table_A";
int id = 1;
User user = sqlSession.selectOne("selectUserById", Collections.singletonMap("tableName", tableName));
この方法により、信頼できるソースから表名を取得することが保証され、直接文字列を結合することによるインジェクションリスクが回避されます。