开启filter之后,如下sql 1.2.3版本会报错
String url = "jdbc:oracle:thin:@xx/xx";
String driver = "oracle.jdbc.driver.OracleDriver";
String user_name = "xx";
String password = "xx";
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUsername(user_name);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setMaxActive(5);
dataSource.setMaxWait(20000);
dataSource.setFilters("wall,stat");
dataSource.init();
Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("select/+QUERY_TIMEOUT(600000000)/ * from test_number"); ResultSet resultSet = preparedStatement.executeQuery();
会有如下报错: java.sql.SQLException: sql injection violation, dbType oracle, druid-version 1.2.3, hint not allow : select/+QUERY_TIMEOUT(600000000)/ * from test_number
at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:856) at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:292) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568) at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:341) at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:351)
回退到1.1.23版本没有报错。
原提问者GitHub用户fox1987
问题是在使用 Druid 数据源连接 Oracle 数据库时,开启了 WallFilter 过滤器,并且执行 SQL 语句时出现了 SQL 注入检测的错误提示。具体来说,是在使用 Druid 1.2.3 版本时,执行 "select/+QUERY_TIMEOUT(600000000)/ * from test_number" 的 SQL 语句时出现了错误,而在使用 Druid 1.1.23 版本时则没有出现错误。
这可能是由于 Druid 1.2.3 版本中的 WallFilter 过滤器增加了新的 SQL 注入检测规则,导致一些合法的 SQL 语句被误判为 SQL 注入攻击。具体来说,"select/+QUERY_TIMEOUT(600000000)/ * from test_number" 的 SQL 语句中包含了 Oracle 的查询提示语法 "+QUERY_TIMEOUT(600000000)",而这个语法被 WallFilter 误判为 SQL 注入攻击,从而导致错误提示。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.5
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。