jdbc删除创建存储过程时Druid拦截保存问题
@wenshao 你好,想跟你请教个问题:我Java jdbc代码执行删除存储过程sql语句,但是报了错误
java.sql.SQLException: sql injection violation, class com.alibaba.druid.sql.ast.statement.SQLDropProcedureStatement not allow : DROP PROCEDURE IF EXISTS CP_PayCalc1
at com.alibaba.druid.wall.WallFilter.check(WallFilter.java:714)
at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:240)
at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448)
at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:928)
at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122)
at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448)
at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:342)
at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:323)
at com.mchr.db.Database.execute(Database.java:222)
at com.mchr.db.Database.execute(Database.java:210)
at com.mchr.custom.controller.PayFormulaController.main(PayFormulaController.java:107)
Exception in thread "main" com.mchr.exception.SqlException: SQL:1 param:[] sql: DROP PROCEDURE IF EXISTS CP_PayCalc1 sql injection violation, class com.alibaba.druid.sql.ast.statement.SQLDropProcedureStatement not allow : DROP PROCEDURE IF EXISTS CP_PayCalc1
at com.mchr.db.Database.getSqlException(Database.java:916)
at com.mchr.db.Database.execute(Database.java:229)
at com.mchr.db.Database.execute(Database.java:210)
at com.mchr.custom.controller.PayFormulaController.main(PayFormulaController.java:107)
最后,我把filter中的wall去掉好了,但是这样就不能进行预防sql注入了,请问有没有更好的解决办法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
MySQL数据库,那新版本sql语句创建存储过程支持吗,我试了一下,老版本创建存储过程也报错。
Druid在于Activiti使用的时候也遇到过SQL防火墙不支持某些语句,Druid的SQL防火墙或拦截Activiti工作流框架执行的一些比如创建表之类的SQL语句。我现在做法是暂时不开启这个功能。
这个是问题,内置的SQL防火墙目前不支持DropProcedure语法,已经修复此问题,等周末发布新版本吧
因为我要用代码生成一个存储过程,首先要判断一下数据库有没有这个存储过程,有的话就删了它再重新创建,但是就在删除的时候报错说是sql注入,不允许操作,有好的解决办法没?
回复:
@小鹏学开源 绕个道吧,试试create or replace process试试。如果再不行,就把创建语法封装到一个function里试试。
正常的业务处理,怎么会要执行删除存储过程的代码呢?
好的,谢谢!
遇到问题反馈到这里:https://github.com/alibaba/druid/issues ,我会尽快跟进的,最近更新还挺快的