This commit is contained in:
温少
2012-03-17 00:56:35 +08:00
parent aaa3dcc7a1
commit d3d0a5c193
5 changed files with 133 additions and 65 deletions
@@ -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;
@@ -24,6 +26,29 @@ public class WallConfig {
protected final Set<String> permitNames = new HashSet<String>();
protected final Set<String> permitObjects = new HashSet<String>();
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;
}
@@ -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);
@@ -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;
@@ -88,22 +89,56 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
@Override
public boolean visit(MySqlDeleteStatement x) {
WallVisitorUtils.checkCondition(this, x.getWhere());
return true;
return visit((SQLDeleteStatement) x);
}
@Override
public boolean visit(SQLDeleteStatement x) {
if (!config.isDeleteAllow()) {
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
return false;
}
WallVisitorUtils.checkCondition(this, x.getWhere());
return true;
}
@Override
public boolean visit(SQLUpdateStatement x) {
if (!config.isUpdateAllow()) {
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
return false;
}
WallVisitorUtils.checkCondition(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;
}
@Override
public boolean visit(Limit x) {
if (x.getRowCount() instanceof SQLNumericLiteralExpr) {
@@ -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) {
@@ -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;
@@ -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.checkCondition(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.checkCondition(this, x.getWhere());
return true;
}
}