From 771ca0e577fbb7c51e3f7a3c23a6210536cef625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Sat, 17 Mar 2012 01:23:52 +0800 Subject: [PATCH] refactor --- .../alibaba/druid/filter/wall/WallConfig.java | 53 +++++++++++ .../filter/wall/spi/MySqlWallProvider.java | 22 +---- .../filter/wall/spi/MySqlWallVisitor.java | 47 ++++++++-- .../filter/wall/spi/OracleWallProvider.java | 21 +---- .../filter/wall/spi/OracleWallVisitor.java | 93 ++++++++++++++----- .../filter/wall/spi/WallVisitorUtils.java | 34 ++++++- 6 files changed, 199 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/alibaba/druid/filter/wall/WallConfig.java b/src/main/java/com/alibaba/druid/filter/wall/WallConfig.java index c639e00c52..b4e9e67c79 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/filter/wall/WallConfig.java @@ -1,5 +1,7 @@ package com.alibaba.druid.filter.wall; +import static com.alibaba.druid.filter.wall.spi.WallVisitorUtils.loadResource; + import java.util.HashSet; import java.util.Set; @@ -18,12 +20,39 @@ public class WallConfig { private boolean insertAllow = true; private boolean mergeAllow = true; + private boolean shcemaCheck = true; + private boolean tableCheck = true; + private boolean functionCheck = true; + protected final Set permitFunctions = new HashSet(); protected final Set permitTables = new HashSet(); protected final Set permitSchemas = new HashSet(); protected final Set permitNames = new HashSet(); protected final Set permitObjects = new HashSet(); + public void loadDefault(String dir) { + if (dir.endsWith("/")) { + dir = dir.substring(0, dir.length() - 1); + } + loadResource(getPermitNames(), dir + "/permit-name-default.txt"); + loadResource(getPermitSchemas(), dir + "/permit-schema-default.txt"); + loadResource(getPermitFunctions(), dir + "/permit-function-default.txt"); + loadResource(getPermitTables(), dir + "/permit-table-default.txt"); + loadResource(getPermitObjects(), dir + "/permit-object-default.txt"); + } + + public void loadExtend(String dir) { + if (dir.endsWith("/")) { + dir = dir.substring(0, dir.length() - 1); + } + + loadResource(getPermitNames(), dir + "permit-name.txt"); + loadResource(getPermitSchemas(), dir + "permit-schema.txt"); + loadResource(getPermitFunctions(), dir + "permit-function.txt"); + loadResource(getPermitTables(), dir + "permit-table.txt"); + loadResource(getPermitObjects(), dir + "permit-object.txt"); + } + public boolean isSelelctAllow() { return selelctAllow; } @@ -96,6 +125,30 @@ public class WallConfig { this.mergeAllow = mergeAllow; } + public boolean isShcemaCheck() { + return shcemaCheck; + } + + public void setShcemaCheck(boolean shcemaCheck) { + this.shcemaCheck = shcemaCheck; + } + + public boolean isTableCheck() { + return tableCheck; + } + + public void setTableCheck(boolean tableCheck) { + this.tableCheck = tableCheck; + } + + public boolean isFunctionCheck() { + return functionCheck; + } + + public void setFunctionCheck(boolean functionCheck) { + this.functionCheck = functionCheck; + } + public Set getPermitFunctions() { return permitFunctions; } diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallProvider.java b/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallProvider.java index e00e80bef3..cb6f297f91 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallProvider.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallProvider.java @@ -1,7 +1,5 @@ package com.alibaba.druid.filter.wall.spi; -import static com.alibaba.druid.filter.wall.spi.WallVisitorUtils.loadResource; - import com.alibaba.druid.filter.wall.WallConfig; import com.alibaba.druid.filter.wall.WallProvider; import com.alibaba.druid.filter.wall.WallVisitor; @@ -22,30 +20,14 @@ public class MySqlWallProvider extends WallProvider { super(config); if (loadDefault) { - loadDefault(); + config.loadDefault("META-INF/druid/wall/mysql"); } if (loadExtend) { - loadExtend(); + config.loadExtend("META-INF/druid/wall/mysql"); } } - public void loadExtend() { - loadResource(config.getPermitNames(), "META-INF/druid/wall/mysql/permit-name.txt"); - loadResource(config.getPermitSchemas(), "META-INF/druid/wall/mysql/permit-schema.txt"); - loadResource(config.getPermitFunctions(), "META-INF/druid/wall/mysql/permit-function.txt"); - loadResource(config.getPermitTables(), "META-INF/druid/wall/mysql/permit-table.txt"); - loadResource(config.getPermitObjects(), "META-INF/druid/wall/mysql/permit-object.txt"); - } - - public void loadDefault() { - loadResource(config.getPermitNames(), "META-INF/druid/wall/mysql/permit-name-default.txt"); - loadResource(config.getPermitSchemas(), "META-INF/druid/wall/mysql/permit-schema-default.txt"); - loadResource(config.getPermitFunctions(), "META-INF/druid/wall/mysql/permit-function-default.txt"); - loadResource(config.getPermitTables(), "META-INF/druid/wall/mysql/permit-table-default.txt"); - loadResource(config.getPermitObjects(), "META-INF/druid/wall/mysql/permit-object-default.txt"); - } - @Override public SQLStatementParser createParser(String sql) { return new MySqlStatementParser(sql); diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallVisitor.java b/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallVisitor.java index d655fb0e7c..e3ed6ece75 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallVisitor.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/MySqlWallVisitor.java @@ -26,6 +26,7 @@ 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.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectGroupBy; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; @@ -77,30 +78,64 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi } public boolean visit(SQLSelectGroupByClause x) { - WallVisitorUtils.checkCondition(this, x.getHaving()); + WallVisitorUtils.checkHaving(this, x.getHaving()); return true; } public boolean visit(MySqlSelectGroupBy x) { - WallVisitorUtils.checkCondition(this, x.getHaving()); + WallVisitorUtils.checkHaving(this, x.getHaving()); return true; } @Override public boolean visit(MySqlDeleteStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; + return visit((SQLDeleteStatement) x); } @Override public boolean visit(SQLDeleteStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); + if (!config.isDeleteAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + WallVisitorUtils.checkDeleteCondition(this, x.getWhere()); return true; } @Override public boolean visit(SQLUpdateStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); + if (!config.isUpdateAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + WallVisitorUtils.checkUpdateCondition(this, x.getWhere()); + return true; + } + + @Override + public boolean visit(MySqlInsertStatement x) { + return visit((SQLInsertStatement) x); + } + + @Override + public boolean visit(SQLInsertStatement x) { + if (!config.isInsertAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + return true; + } + + @Override + public boolean visit(SQLSelectStatement x) { + if (!config.isSelelctAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + return true; } diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallProvider.java b/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallProvider.java index 0e64de19dd..b71cf60aff 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallProvider.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallProvider.java @@ -1,7 +1,5 @@ package com.alibaba.druid.filter.wall.spi; -import static com.alibaba.druid.filter.wall.spi.WallVisitorUtils.loadResource; - import com.alibaba.druid.filter.wall.WallConfig; import com.alibaba.druid.filter.wall.WallProvider; import com.alibaba.druid.filter.wall.WallVisitor; @@ -22,29 +20,14 @@ public class OracleWallProvider extends WallProvider { super(config); if (loadDefault) { - loadDefault(); + config.loadDefault("META-INF/druid/wall/oracle"); } if (loadExtend) { - loadExtend(); + config.loadExtend("META-INF/druid/wall/oracle"); } } - public void loadExtend() { - loadResource(config.getPermitNames(), "META-INF/druid/wall/oracle/permit-name.txt"); - loadResource(config.getPermitSchemas(), "META-INF/druid/wall/oracle/permit-schema.txt"); - loadResource(config.getPermitFunctions(), "META-INF/druid/wall/oracle/permit-function.txt"); - loadResource(config.getPermitTables(), "META-INF/druid/wall/oracle/permit-table.txt"); - loadResource(config.getPermitObjects(), "META-INF/druid/wall/oracle/permit-object.txt"); - } - - public void loadDefault() { - loadResource(config.getPermitNames(), "META-INF/druid/wall/oracle/permit-name-default.txt"); - loadResource(config.getPermitSchemas(), "META-INF/druid/wall/oracle/permit-schema-default.txt"); - loadResource(config.getPermitFunctions(), "META-INF/druid/wall/oracle/permit-function-default.txt"); - loadResource(config.getPermitTables(), "META-INF/druid/wall/oracle/permit-table-default.txt"); - loadResource(config.getPermitObjects(), "META-INF/druid/wall/oracle/permit-object-default.txt"); - } @Override public SQLStatementParser createParser(String sql) { diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallVisitor.java b/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallVisitor.java index 79ab9c6c8a..4f8c95cfac 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallVisitor.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/OracleWallVisitor.java @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; @@ -92,7 +93,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi } public boolean visit(SQLSelectGroupByClause x) { - WallVisitorUtils.checkCondition(this, x.getHaving()); + WallVisitorUtils.checkHaving(this, x.getHaving()); return true; } @@ -119,30 +120,6 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi return true; } - @Override - public boolean visit(OracleDeleteStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; - } - - @Override - public boolean visit(SQLDeleteStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; - } - - @Override - public boolean visit(SQLUpdateStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; - } - - @Override - public boolean visit(OracleUpdateStatement x) { - WallVisitorUtils.checkCondition(this, x.getWhere()); - return true; - } - @Override public String toSQL(SQLObject obj) { return SQLUtils.toOracleString(obj); @@ -182,4 +159,70 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi return config.getPermitObjects().contains(name); } + @Override + public boolean visit(SQLSelectStatement x) { + if (!config.isSelelctAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + return true; + } + + @Override + public boolean visit(OracleInsertStatement x) { + return visit((SQLInsertStatement) x); + } + + @Override + public boolean visit(SQLInsertStatement x) { + if (!config.isInsertAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + return true; + } + + @Override + public boolean visit(OracleMultiInsertStatement x) { + if (!config.isInsertAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + return true; + } + + @Override + public boolean visit(OracleDeleteStatement x) { + return visit((SQLDeleteStatement) x); + } + + @Override + public boolean visit(SQLDeleteStatement x) { + if (!config.isDeleteAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + WallVisitorUtils.checkDeleteCondition(this, x.getWhere()); + return true; + } + + @Override + public boolean visit(OracleUpdateStatement x) { + return visit((SQLUpdateStatement) x); + } + + @Override + public boolean visit(SQLUpdateStatement x) { + if (!config.isUpdateAllow()) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + return false; + } + + WallVisitorUtils.checkUpdateCondition(this, x.getWhere()); + return true; + } } diff --git a/src/main/java/com/alibaba/druid/filter/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/filter/wall/spi/WallVisitorUtils.java index f5d16233ea..f383f26cdc 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/filter/wall/spi/WallVisitorUtils.java @@ -78,11 +78,43 @@ public class WallVisitorUtils { } } - public static void checkCondition(WallVisitor visitor, SQLExpr x) { + public static void checkHaving(WallVisitor visitor, SQLExpr x) { if (x == null) { return; } + if (!visitor.getConfig().isSelectHavingAlwayTrueCheck()) { + return; + } + + if (Boolean.TRUE == getValue(x)) { + visitor.getViolations().add(new IllegalSQLObjectViolation(SQLUtils.toSQLString(x))); + } + } + + public static void checkDeleteCondition(WallVisitor visitor, SQLExpr x) { + if (x == null) { + return; + } + + if (!visitor.getConfig().isDeleteWhereAlwayTrueCheck()) { + return; + } + + if (Boolean.TRUE == getValue(x)) { + visitor.getViolations().add(new IllegalSQLObjectViolation(SQLUtils.toSQLString(x))); + } + } + + public static void checkUpdateCondition(WallVisitor visitor, SQLExpr x) { + if (x == null) { + return; + } + + if (!visitor.getConfig().isUpdateWhereAlayTrueCheck()) { + return; + } + if (Boolean.TRUE == getValue(x)) { visitor.getViolations().add(new IllegalSQLObjectViolation(SQLUtils.toSQLString(x))); }