JFinal+druid使用过程的一点问题。。

黄开源中国 发布于 2013/08/26 11:51
阅读 1K+
收藏 0

问题1:开了wallfilter以后。。。语句经常被检测成sql注入。。

CASE 
         WHEN s.field IS NOT NULL THEN REPLACE(s.field ,'%value%',s.`STATUS`) 

问题2:同样是sql 注入,order by a.field =1, a.field2

问题3:譬如select sum(t.i) as i from table t ......

然后使用getInt("i")来获取就报错
Caused by :lang.ClassCAstException: Bigdecimal cannot be cast to Integer

我确认过这个i字段是Int(11),然后取值的时候是没过两位数。结果还是报错了。。请问是什么原因。?为什么sum了以后获取会是Bigdecimal这种类型。。?什么情况下才会转?

对于问题1,2的话是不是由于我的sql用法不对?因为我觉得druid这么大个项目没可能出现这么多种过滤的问题吧?如果这种写法不对的话有没什么好的替代方法?~@wenshao ,@JFinal。。

加载中
0
wenshao
wenshao
告诉我druid版本和具体被拦截的sql。
0
黄开源中国
黄开源中国

引用来自“wenshao”的答案

告诉我druid版本和具体被拦截的sql。
版本是0.2.20
Caused by: java.sql.SQLException: sql injection violation, ERROR. token : REPLACE, pos : 187 :
 SELECT COUNT(s.id),s.`STATUS`,m.id as member_id,s.outbox_msg_id,m.charging,o.pid
   FROM
    (SELECT  s.id,s.interface,s.mid,s.outbox_msg_id,
CASE WHEN s.optimize_status IS NOT NULL THEN REPLACE(s.optimize_status,'%value%',s.`STATUS`) ELSE s.`STATUS` END AS `STATUS` FROM send_log_20130826 AS s  )   ....

以上是问题1对应的语句,问题2我代码删了,现在重现出来的结果就变成是jfinal的一个sql replace的时候有问题。。过滤错了我的语句

0
wenshao
wenshao
升级到druid-0.2.25版本
黄开源中国
黄开源中国
升级了的确解决了这个问题。谢谢。。在看更新的日志。。
0
玛雅牛
玛雅牛

对于问题三。

问题3:譬如select sum(t.i) as i from table t ......

然后使用getInt("i")来获取就报错
Caused by :lang.ClassCAstException: Bigdecimal cannot be cast to Integer

这可能是数据的某种策略,为了防止上溢出而做的一种妥协办法。
解决办法是用getBigDecimal来取值。

黄开源中国
黄开源中国
的确只能这样了。。想问下有没什么地方可以查到这个sum,count等聚合函数结果对应Java类型?因为这个类型好像还会变的。。我想知道有没什么规律。
返回顶部
顶部