Ошибка Mybatis: нарушение sql-инъекции, синтаксическая ошибка при использовании xmlagg(xmlparse(содержимое s_id||’|’) по порядку s_id)

#java #spring-boot #mybatis #spring-mybatis #mybatis-sql

Вопрос:

Мое окружение

 org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3
org.mybatis:mybatis:3.5.5
Oracle version: Oracle Database 12c Release 12.2.0.1.0
 

есть таблица( TBL_TEST ), данные:

    ip        s_id
---------------------
127.0.0.1      1
127.0.0.1      2
127.0.0.1      3

 

выполнение SQL в базе данных Oracle

 SELECT 
ip, 
xmlagg(xmlparse(content s_id||'|') order by s_id).getclobval() s_ids
FROM TBL_TEST t group by ip
 

Результат

    ip            s_ids
-------------------------
127.0.0.1        1|2|3|
 

но когда я использую Mybatis:

 <select id="groupByIp" resultMap="IpConfig">
  select
  ip,
  xmlagg(xmlparse(content s_id||'|') order by s_id).getclobval() s_ids
  from TBL_TEST t group by ip
</select>
 

Он получает ошибку:

 ### Error querying database.  Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 47, line 3, column 29, token IDENTIFIER s_id : select
    ip,
    xmlagg(xmlparse(content s_id||'|') order by s_id).getclobval() s_ids
    from TBL_TEST t group by ip
### The error occurred while executing a query
### SQL: select     ip,     xmlagg(xmlparse(content s_id||'|') order by s_id).getclobval() s_ids     from TBL_TEST t group by ip
### Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 47, line 3, column 29, token IDENTIFIER s_id : select
    ip,
    xmlagg(xmlparse(content s_id||'|') order by s_id).getclobval() s_ids
    from TBL_TEST t group by ip
; uncategorized SQLException; SQL state [null]; error code [0]; sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 47, line 3, column 29, token IDENTIFIER s_id : select
    ip,
    xmlagg(xmlparse(content s_id||'|') order by s_id).getclobval() s_ids
    from TBL_TEST t group by ip; nested exception is java.sql.SQLException: sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 47, line 3, column 29, token IDENTIFIER s_id : select
    ip,
    xmlagg(xmlparse(content s_id||'|') order by s_id).getclobval() s_ids
    from TBL_TEST t group by ip
    
 

как это исправить?

Комментарии:

1. Вероятно, это не проблема MyBatis. Это похоже на проблему в синтаксическом анализаторе SQL Alibaba Druid. Здесь на Github есть аналогичная проблема: github.com/alibaba/druid/issues/4259