mybatisの動的テーブル名はSQLインジェクションを回避する方法
MyBatis で SQL インジェクションを防ぐには、テーブル名を動的に構築する方法があります:
- Mapperインターフェイスで@Paramアノテーションを使ってテーブル名引数を受け渡し、SQL ステートメントで#{paramName}を使って引数を参照します。例:
public interface MyMapper {
List<MyEntity> selectByTableName(@Param("tableName") String tableName);
}
<select id="selectByTableName" resultType="MyEntity">
SELECT * FROM ${tableName}
</select>
- SQL文を、条件によって動的に構築します。これにより、テーブル名の検証や処理がSQL文構築時に可能になります。例えば、
<select id="selectByTableName" resultType="MyEntity">
<choose>
<when test="tableName == 'table1'">
SELECT * FROM table1
</when>
<when test="tableName == 'table2'">
SELECT * FROM table2
</when>
<otherwise>
SELECT * FROM defaultTable
</otherwise>
</choose>
</select>
SQL文に直接テーブル名パラメータが連結されることがなく、入力されたテーブル名が検証および処理され、SQLインジェクション攻撃が防がれます。