From f1e6e0d9378796977d30bd43df706dec40010e0c Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 19 Mar 2013 01:25:59 +0800 Subject: [PATCH] improve WallFilter, support minusAllow --- .../com/alibaba/druid/wall/WallConfig.java | 13 +++++++++-- .../druid/wall/spi/WallVisitorUtils.java | 10 ++++++-- .../druid/bvt/filter/wall/MinusTest.java | 23 +++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/MinusTest.java diff --git a/src/main/java/com/alibaba/druid/wall/WallConfig.java b/src/main/java/com/alibaba/druid/wall/WallConfig.java index a8807784b4..4ca59d25b4 100644 --- a/src/main/java/com/alibaba/druid/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/wall/WallConfig.java @@ -44,6 +44,7 @@ public class WallConfig implements WallConfigMBean { private boolean insertAllow = true; private boolean mergeAllow = true; + private boolean minusAllow = false; private boolean multiStatementAllow = false; @@ -89,6 +90,14 @@ public class WallConfig implements WallConfigMBean { public WallConfig(){ } + + public boolean isMinusAllow() { + return minusAllow; + } + + public void setMinusAllow(boolean minusAllow) { + this.minusAllow = minusAllow; + } public boolean isConditionOpXorAllow() { return conditionOpXorAllow; @@ -97,11 +106,11 @@ public class WallConfig implements WallConfigMBean { public void setConditionOpXorAllow(boolean conditionOpXorAllow) { this.conditionOpXorAllow = conditionOpXorAllow; } - + public boolean isConditionOpBitwseAllow() { return conditionOpBitwseAllow; } - + public void setConditionOpBitwseAllow(boolean conditionOpBitwseAllow) { this.conditionOpBitwseAllow = conditionOpBitwseAllow; } diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index 7758e32b19..bb0b82af17 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -54,6 +54,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLTableSource; +import com.alibaba.druid.sql.ast.statement.SQLUnionOperator; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; @@ -498,7 +499,7 @@ public class WallVisitorUtils { public void setXor(boolean xor) { this.xor = xor; } - + public boolean hasBitwise() { return bitwise; } @@ -532,7 +533,7 @@ public class WallVisitorUtils { if (current.hasXor() && !visitor.getConfig().isConditionOpXorAllow()) { addViolation(visitor, x); } - + if (current.hasBitwise() && !visitor.getConfig().isConditionOpBitwseAllow()) { addViolation(visitor, x); } @@ -747,6 +748,11 @@ public class WallVisitorUtils { } public static void checkUnion(WallVisitor visitor, SQLUnionQuery x) { + if (x.getOperator() == SQLUnionOperator.MINUS && !visitor.getConfig().isMinusAllow()) { + addViolation(visitor, x); + return; + } + if (!visitor.getConfig().isSelectUnionCheck()) { return; } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MinusTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MinusTest.java new file mode 100644 index 0000000000..d365522bd8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MinusTest.java @@ -0,0 +1,23 @@ +package com.alibaba.druid.bvt.filter.wall; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.wall.WallConfig; +import com.alibaba.druid.wall.WallUtils; + +public class MinusTest extends TestCase { + + public void test_false() throws Exception { + Assert.assertFalse(WallUtils.isValidateOracle(// + "SELECT * FROM A MINUS SELECT * FROM B")); // + } + + public void test_true() throws Exception { + WallConfig config = new WallConfig(); + config.setMinusAllow(true); + Assert.assertTrue(WallUtils.isValidateOracle(// + "SELECT * FROM A MINUS SELECT * FROM B", config)); // + } +}