druid WallFilter拦截SQL Server 中 inner loop join 关键字

htrmnn0y  于 4个月前  发布在  Druid
关注(0)|答案(1)|浏览(59)

测试中发现某些查询场景下SQL Server对于我们的 inner join 语句没有使用最优的 nested loop 执行计划,因此 sql 中需要强制使用 inner loop join 来指定使用该执行计划,但 loop 关键字会被 wall 拦截。durid版本1.1.11,报错信息如下(sql 已经简化):
Caused by: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'nner loop join table_a a WITH(nolo', expect JOIN, actual LOOP pos 375, line 13, column 22, token LOOP :
SELECT a.mebID,
b.contractMobile
FROM table_b b
inner loop join table_a a WITH(nolock) on a.MebID = b.MebID
WHERE a.state in (2,4) and b.MebName like ?
and (( a.mebtype not in(1, 2, 3) and a.SellerDepID in (?,7) )
or a.mebtype in(1, 2, 3 )
at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:798)
at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:251)
at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568)

du7egjpx

du7egjpx1#

关注着这个问题,有没有什么好的解决方案,比如校验白名单,或者升级版本做一下优化

相关问题