From 56d09e0fe73d6d80d53215ce89994fd37091ce1a Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 18 Dec 2012 23:47:50 +0800 Subject: [PATCH] improve WallFilter --- .../com/alibaba/druid/wall/WallConfig.java | 9 ++++++ .../com/alibaba/druid/wall/WallFilter.java | 29 +++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/alibaba/druid/wall/WallConfig.java b/src/main/java/com/alibaba/druid/wall/WallConfig.java index 1b8f901b28..05a72546f4 100644 --- a/src/main/java/com/alibaba/druid/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/wall/WallConfig.java @@ -77,6 +77,7 @@ public class WallConfig implements WallConfigMBean { private String tenantColumn; private boolean wrapAllow = false; + private boolean metadataAllow = true; public WallConfig(){ @@ -98,6 +99,14 @@ public class WallConfig implements WallConfigMBean { this.tenantColumn = tenantColumn; } + public boolean isMetadataAllow() { + return metadataAllow; + } + + public void setMetadataAllow(boolean metadataAllow) { + this.metadataAllow = metadataAllow; + } + public boolean isWrapAllow() { return wrapAllow; } diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index 32c8ae38be..d1b2dd0f8f 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.wall; +import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.sql.Wrapper; import java.util.Collections; @@ -299,7 +300,7 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { if (violations.size() > 0) { violationCount.incrementAndGet(); - + if (isLogViolation()) { LOG.error("sql injection violation : " + sql); } @@ -336,11 +337,35 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { } if (!this.provider.getConfig().isWrapAllow()) { + violationCount.incrementAndGet(); return null; } + return chain.unwrap(wrapper, iface); } - + + @Override + public DatabaseMetaData connection_getMetaData(FilterChain chain, ConnectionProxy connection) throws SQLException { + if (config.isAllowDoPrivileged() && WallProvider.ispPivileged()) { + return chain.connection_getMetaData(connection); + } + + if (!this.provider.getConfig().isMetadataAllow()) { + violationCount.incrementAndGet(); + if (isLogViolation()) { + LOG.error("not support method : Connection.getMetdataData"); + } + + if (throwException) { + throw new WallSQLException("not support method : Connection.getMetdataData"); + } else { + + } + } + + return chain.connection_getMetaData(connection); + } + public long getViolationCount() { return this.violationCount.get(); }