From cd8f1ddd4e5385601de4256369aa738a148afc3b Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 18 Dec 2012 23:09:47 +0800 Subject: [PATCH] improve WallFilter --- .../com/alibaba/druid/wall/WallFilter.java | 18 ++++++++++++++---- .../alibaba/druid/wall/WallFilterMBean.java | 2 ++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index dc98c6d4e0..32c8ae38be 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -20,6 +20,7 @@ import java.sql.Wrapper; import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; import com.alibaba.druid.DruidRuntimeException; import com.alibaba.druid.filter.FilterAdapter; @@ -53,6 +54,9 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { private volatile boolean logViolation = false; private volatile boolean throwException = true; + // stats + private final AtomicLong violationCount = new AtomicLong(); + @Override public void init(DataSourceProxy dataSource) { if (this.dbType == null || this.dbType.trim().length() == 0) { @@ -294,6 +298,8 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { List violations = checkResult.getViolations(); if (violations.size() > 0) { + violationCount.incrementAndGet(); + if (isLogViolation()) { LOG.error("sql injection violation : " + sql); } @@ -307,16 +313,16 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { } } } - + return sql; } - + @Override public boolean isWrapperFor(FilterChain chain, Wrapper wrapper, Class iface) throws SQLException { if (config.isAllowDoPrivileged() && WallProvider.ispPivileged()) { return chain.isWrapperFor(wrapper, iface); } - + if (!this.provider.getConfig().isWrapAllow()) { return false; } @@ -328,10 +334,14 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { if (config.isAllowDoPrivileged() && WallProvider.ispPivileged()) { return chain.unwrap(wrapper, iface); } - + if (!this.provider.getConfig().isWrapAllow()) { return null; } return chain.unwrap(wrapper, iface); } + + public long getViolationCount() { + return this.violationCount.get(); + } } diff --git a/src/main/java/com/alibaba/druid/wall/WallFilterMBean.java b/src/main/java/com/alibaba/druid/wall/WallFilterMBean.java index 4e3ef49208..297c12f336 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilterMBean.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilterMBean.java @@ -37,4 +37,6 @@ public interface WallFilterMBean { Set getProviderWhiteList(); String check(String sql) throws SQLException; + + long getViolationCount(); }