This commit is contained in:
温少
2012-03-16 20:38:38 +08:00
parent 911c99f7f5
commit 20583a40f1
8 changed files with 161 additions and 169 deletions
@@ -3,12 +3,11 @@ package com.alibaba.druid.filter.wall;
import java.sql.SQLException;
import java.util.Properties;
import com.alibaba.druid.DruidRuntimeException;
import com.alibaba.druid.filter.FilterAdapter;
import com.alibaba.druid.filter.FilterChain;
import com.alibaba.druid.filter.wall.spi.MySqlWallProvider;
import com.alibaba.druid.filter.wall.spi.MySqlWallVisitor;
import com.alibaba.druid.filter.wall.spi.OracleWallProvider;
import com.alibaba.druid.filter.wall.spi.OracleWallVisitor;
import com.alibaba.druid.proxy.jdbc.CallableStatementProxy;
import com.alibaba.druid.proxy.jdbc.ConnectionProxy;
import com.alibaba.druid.proxy.jdbc.DataSourceProxy;
@@ -19,13 +18,45 @@ import com.alibaba.druid.util.JdbcUtils;
public class WallFilter extends FilterAdapter {
private boolean inited = false;
private WallProvider provider;
private boolean loadDefault;
private boolean loadExtend;
@Override
public void init(DataSourceProxy dataSource) {
this.dataSource = dataSource;
provider = createWallProvider(dataSource.getDbType());
this.inited = true;
}
public boolean isLoadDefault() {
return loadDefault;
}
public void checkInit() {
if (inited) {
throw new DruidRuntimeException("wall filter is inited");
}
}
public void setLoadDefault(boolean loadDefault) {
checkInit();
this.loadDefault = loadDefault;
}
public boolean isLoadExtend() {
return loadExtend;
}
public void setLoadExtend(boolean loadExtend) {
checkInit();
this.loadExtend = loadExtend;
}
@Override
@@ -100,9 +131,9 @@ public class WallFilter extends FilterAdapter {
check(connection, sql);
return chain.connection_prepareCall(connection, sql, resultSetType, resultSetConcurrency, resultSetHoldability);
}
////////////////
// //////////////
@Override
public boolean statement_execute(FilterChain chain, StatementProxy statement, String sql) throws SQLException {
check(statement.getConnectionProxy(), sql);
@@ -129,7 +160,7 @@ public class WallFilter extends FilterAdapter {
check(statement.getConnectionProxy(), sql);
return chain.statement_execute(statement, sql, columnNames);
}
@Override
public ResultSetProxy statement_executeQuery(FilterChain chain, StatementProxy statement, String sql)
throws SQLException {
@@ -170,26 +201,14 @@ public class WallFilter extends FilterAdapter {
public WallProvider createWallProvider(String dbType) {
if (JdbcUtils.MYSQL.equals(dbType)) {
return new MySqlWallProvider();
return new MySqlWallProvider(this.loadDefault, this.loadExtend);
}
if (JdbcUtils.ORACLE.equals(dbType)) {
return new OracleWallProvider();
return new OracleWallProvider(this.loadDefault, this.loadExtend);
}
throw new IllegalStateException("dbType not support : " + dbType);
}
public WallVisitor createWallVisitor(String dbType) throws SQLException {
if (JdbcUtils.ORACLE.equals(dbType)) {
return new OracleWallVisitor();
}
if (JdbcUtils.MYSQL.equals(dbType)) {
return new MySqlWallVisitor();
}
throw new SQLException("dbType not support : " + dbType);
}
}
@@ -1,8 +1,10 @@
package com.alibaba.druid.filter.wall;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.parser.NotAllowCommentException;
@@ -18,7 +20,13 @@ public abstract class WallProvider {
private int whileListMaxSize = 1024;
private int whiteSqlMaxLength = 1024; // 1k
private int whiteSqlMaxLength = 1024; // 1k
protected final Set<String> permitFunctions = new HashSet<String>();
protected final Set<String> permitTables = new HashSet<String>();
protected final Set<String> permitSchemas = new HashSet<String>();
protected final Set<String> permitNames = new HashSet<String>();
protected final Set<String> permitObjects = new HashSet<String>();
public synchronized void addWhiteSql(String sql) {
if (whiteList == null) {
@@ -98,4 +106,25 @@ public abstract class WallProvider {
return true;
}
public Set<String> getPermitFunctions() {
return permitFunctions;
}
public Set<String> getPermitTables() {
return permitTables;
}
public Set<String> getPermitSchemas() {
return permitSchemas;
}
public Set<String> getPermitNames() {
return permitNames;
}
public Set<String> getPermitObjects() {
return permitObjects;
}
}
@@ -1,26 +1,19 @@
package com.alibaba.druid.filter.wall;
import java.util.List;
import java.util.Set;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public interface WallVisitor extends SQLASTVisitor {
WallProvider getWallProvider();
List<Violation> getViolations();
Set<String> getPermitFunctions();
Set<String> getPermitSchemas();
Set<String> getPermitTables();
boolean containsPermitTable(String name);
boolean containsPermitObjects(String name);
Set<String> getPermitNames();
String toSQL(SQLObject obj);
}
@@ -5,9 +5,39 @@ import com.alibaba.druid.filter.wall.WallVisitor;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
public class MySqlWallProvider extends WallProvider {
public MySqlWallProvider(){
this(true, true);
}
public MySqlWallProvider(boolean loadDefault, boolean loadExtend){
if (loadDefault) {
loadDefault();
}
if (loadExtend) {
loadExtend();
}
}
public void loadExtend() {
WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-mysql.txt");
WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-mysql.txt");
WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-mysql.txt");
WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-mysql.txt");
WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-mysql.txt");
}
public void loadDefault() {
WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-mysql-default.txt");
WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-mysql-default.txt");
WallVisitorUtils.loadResource(this.permitFunctions,
"META-INF/druid-filter-wall-permit-function-mysql-default.txt");
WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-mysql-default.txt");
WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-mysql-default.txt");
}
@Override
public SQLStatementParser createParser(String sql) {
return new MySqlStatementParser(sql);
@@ -15,7 +45,7 @@ public class MySqlWallProvider extends WallProvider {
@Override
public WallVisitor createWallVisitor() {
return new MySqlWallVisitor();
return new MySqlWallVisitor(this);
}
}
@@ -1,12 +1,11 @@
package com.alibaba.druid.filter.wall.spi;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.alibaba.druid.filter.wall.IllegalSQLObjectViolation;
import com.alibaba.druid.filter.wall.Violation;
import com.alibaba.druid.filter.wall.WallProvider;
import com.alibaba.druid.filter.wall.WallVisitor;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLName;
@@ -35,67 +34,20 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter;
public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisitor, MySqlASTVisitor {
private final Set<String> permitFunctions = new HashSet<String>();
private final Set<String> permitTables = new HashSet<String>();
private final Set<String> permitSchemas = new HashSet<String>();
private final Set<String> permitNames = new HashSet<String>();
private final Set<String> permitObjects = new HashSet<String>();
private final MySqlWallProvider provider;
private final List<Violation> violations = new ArrayList<Violation>();
private final List<Violation> violations;
public MySqlWallVisitor(){
this(new ArrayList<Violation>(), true);
public MySqlWallVisitor(MySqlWallProvider provider){
this.provider = provider;
}
public MySqlWallVisitor(boolean loadDefault){
this(new ArrayList<Violation>(), loadDefault);
}
public MySqlWallVisitor(List<Violation> violations, boolean loadDefault){
this.violations = violations;
if (loadDefault) {
loadDefault();
}
WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-mysql.txt");
WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-mysql.txt");
WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-mysql.txt");
WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-mysql.txt");
WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-mysql.txt");
}
public void loadDefault() {
WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-mysql-default.txt");
WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-mysql-default.txt");
WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-mysql-default.txt");
WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-mysql-default.txt");
WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-mysql-default.txt");
}
public Set<String> getPermitNames() {
return permitNames;
}
public Set<String> getPermitFunctions() {
return permitFunctions;
}
public Set<String> getPermitTables() {
return permitTables;
}
public Set<String> getPermitSchemas() {
return permitSchemas;
public WallProvider getWallProvider() {
return provider;
}
public boolean containsPermitObjects(String name) {
name = name.toLowerCase();
return permitObjects.contains(name);
}
public Set<String> getPermitObjects() {
return permitObjects;
return provider.getPermitObjects().contains(name);
}
public List<Violation> getViolations() {
@@ -216,7 +168,7 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
@Override
public boolean containsPermitTable(String name) {
name = WallVisitorUtils.form(name);
return permitTables.contains(name);
return provider.getPermitTables().contains(name);
}
public void preVisit(SQLObject x) {
@@ -236,4 +188,5 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
violations.add(new IllegalSQLObjectViolation(SQLUtils.toMySqlString(x)));
}
}
}
@@ -5,9 +5,39 @@ import com.alibaba.druid.filter.wall.WallVisitor;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
public class OracleWallProvider extends WallProvider {
public OracleWallProvider(){
this(true, true);
}
public OracleWallProvider(boolean loadDefault, boolean loadExtend){
if (loadDefault) {
loadDefault();
}
if (loadExtend) {
loadExtend();
}
}
public void loadExtend() {
WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-oracle.txt");
WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-oracle.txt");
WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-oracle.txt");
WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-oracle.txt");
WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-oracle.txt");
}
public void loadDefault() {
WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-oracle-default.txt");
WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-oracle-default.txt");
WallVisitorUtils.loadResource(this.permitFunctions,
"META-INF/druid-filter-wall-permit-function-oracle-default.txt");
WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-oracle-default.txt");
WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-oracle-default.txt");
}
@Override
public SQLStatementParser createParser(String sql) {
return new OracleStatementParser(sql);
@@ -15,7 +45,7 @@ public class OracleWallProvider extends WallProvider {
@Override
public WallVisitor createWallVisitor() {
return new OracleWallVisitor();
return new OracleWallVisitor(this);
}
}
@@ -1,12 +1,11 @@
package com.alibaba.druid.filter.wall.spi;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.alibaba.druid.filter.wall.IllegalSQLObjectViolation;
import com.alibaba.druid.filter.wall.Violation;
import com.alibaba.druid.filter.wall.WallProvider;
import com.alibaba.druid.filter.wall.WallVisitor;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLName;
@@ -35,82 +34,16 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVIsitorAdapter;
public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVisitor {
private final Set<String> permitFunctions = new HashSet<String>();
private final Set<String> permitTables = new HashSet<String>();
private final Set<String> permitSchemas = new HashSet<String>();
private final Set<String> permitNames = new HashSet<String>();
private final Set<String> permitObjects = new HashSet<String>();
private OracleWallProvider provider;
private final List<Violation> violations = new ArrayList<Violation>();
private final List<Violation> violations;
public OracleWallVisitor(){
this(new ArrayList<Violation>(), true);
}
public OracleWallVisitor(boolean loadDefault){
this(new ArrayList<Violation>(), loadDefault);
}
public OracleWallVisitor(List<Violation> violations, boolean loadDefault){
this.violations = violations;
if (loadDefault) {
loadDefault();
}
WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-oracle.txt");
WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-oracle.txt");
WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-oracle.txt");
WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-oracle.txt");
WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-oracle.txt");
}
public void loadDefault() {
WallVisitorUtils.loadResource(this.permitNames, "META-INF/druid-filter-wall-permit-name-oracle-default.txt");
WallVisitorUtils.loadResource(this.permitSchemas, "META-INF/druid-filter-wall-permit-schema-oracle-default.txt");
WallVisitorUtils.loadResource(this.permitFunctions, "META-INF/druid-filter-wall-permit-function-oracle-default.txt");
WallVisitorUtils.loadResource(this.permitTables, "META-INF/druid-filter-wall-permit-table-oracle-default.txt");
WallVisitorUtils.loadResource(this.permitObjects, "META-INF/druid-filter-wall-permit-object-oracle-default.txt");
}
public void addPermitName(String name) {
name = name.toLowerCase();
permitNames.add(name);
}
public void addPermitFunction(String name) {
name = name.toLowerCase();
permitFunctions.add(name);
}
public void addPermitTable(String name) {
name = name.toLowerCase();
permitTables.add(name);
public OracleWallVisitor(OracleWallProvider provider){
this.provider = provider;
}
public boolean containsPermitObjects(String name) {
name = name.toLowerCase();
return permitObjects.contains(name);
}
public Set<String> getPermitObjects() {
return permitObjects;
}
public Set<String> getPermitNames() {
return permitNames;
}
public Set<String> getPermitFunctions() {
return permitFunctions;
}
public Set<String> getPermitTables() {
return permitTables;
}
public Set<String> getPermitSchemas() {
return permitSchemas;
return provider.getPermitObjects().contains(name);
}
public List<Violation> getViolations() {
@@ -220,7 +153,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
if (name.startsWith("v$") || name.startsWith("v_$")) {
return true;
}
return permitTables.contains(name);
return provider.getPermitTables().contains(name);
}
public void preVisit(SQLObject x) {
@@ -242,4 +175,9 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
violations.add(new IllegalSQLObjectViolation(SQLUtils.toMySqlString(x)));
}
}
@Override
public WallProvider getWallProvider() {
return this.provider;
}
}
@@ -304,7 +304,7 @@ public class WallVisitorUtils {
public static void check(WallVisitor visitor, SQLMethodInvokeExpr x) {
String methodName = x.getMethodName();
if (visitor.getPermitFunctions().contains(methodName.toLowerCase())) {
if (visitor.getWallProvider().getPermitFunctions().contains(methodName.toLowerCase())) {
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
}
@@ -322,7 +322,7 @@ public class WallVisitorUtils {
ownerName = form(ownerName);
if (visitor.getPermitSchemas().contains(ownerName.toLowerCase())) {
if (visitor.getWallProvider().getPermitSchemas().contains(ownerName.toLowerCase())) {
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
}
}