mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
refactor
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package com.alibaba.druid.sql.visitor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public interface ExportParameterVisitor extends SQLASTVisitor {
|
||||
|
||||
List<Object> getParameters();
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
public interface WallVisitor extends SQLASTVisitor {
|
||||
|
||||
WallConfig getConfig();
|
||||
|
||||
WallProvider getProvider();
|
||||
|
||||
List<Violation> getViolations();
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ public class MySqlWallProvider extends WallProvider {
|
||||
|
||||
@Override
|
||||
public WallVisitor createWallVisitor() {
|
||||
return new MySqlWallVisitor(config);
|
||||
return new MySqlWallVisitor(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -32,16 +32,23 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
|
||||
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter;
|
||||
import com.alibaba.druid.wall.Violation;
|
||||
import com.alibaba.druid.wall.WallConfig;
|
||||
import com.alibaba.druid.wall.WallProvider;
|
||||
import com.alibaba.druid.wall.WallVisitor;
|
||||
import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation;
|
||||
|
||||
public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisitor, MySqlASTVisitor {
|
||||
|
||||
private final WallConfig config;
|
||||
private final WallProvider provider;
|
||||
private final List<Violation> violations = new ArrayList<Violation>();
|
||||
|
||||
public MySqlWallVisitor(WallConfig config){
|
||||
this.config = config;
|
||||
public MySqlWallVisitor(WallProvider provider){
|
||||
this.config = provider.getConfig();
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
public WallProvider getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
public WallConfig getConfig() {
|
||||
@@ -56,7 +63,7 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
WallVisitorUtils.check(this, x);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public boolean visit(SQLInListExpr x) {
|
||||
WallVisitorUtils.check(this, x);
|
||||
return true;
|
||||
@@ -93,7 +100,7 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
@Override
|
||||
public boolean visit(MySqlDeleteStatement x) {
|
||||
WallVisitorUtils.checkReadOnly(this, x.getFrom());
|
||||
|
||||
|
||||
return visit((SQLDeleteStatement) x);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ public class OracleWallProvider extends WallProvider {
|
||||
|
||||
@Override
|
||||
public WallVisitor createWallVisitor() {
|
||||
return new OracleWallVisitor(config);
|
||||
return new OracleWallVisitor(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -32,16 +32,23 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVIsitorAdapter;
|
||||
import com.alibaba.druid.wall.Violation;
|
||||
import com.alibaba.druid.wall.WallConfig;
|
||||
import com.alibaba.druid.wall.WallProvider;
|
||||
import com.alibaba.druid.wall.WallVisitor;
|
||||
import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation;
|
||||
|
||||
public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVisitor {
|
||||
|
||||
private final WallConfig config;
|
||||
private final WallProvider provider;
|
||||
private final List<Violation> violations = new ArrayList<Violation>();
|
||||
|
||||
public OracleWallVisitor(WallConfig config){
|
||||
this.config = config;
|
||||
public OracleWallVisitor(WallProvider provider){
|
||||
this.config = provider.getConfig();
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
public WallProvider getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
public WallConfig getConfig() {
|
||||
@@ -65,7 +72,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
WallVisitorUtils.check(this, x);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public boolean visit(SQLInListExpr x) {
|
||||
WallVisitorUtils.check(this, x);
|
||||
return true;
|
||||
@@ -190,11 +197,11 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(InsertIntoClause x) {
|
||||
WallVisitorUtils.checkInsert(this, x);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ public class SQLServerProvider extends WallProvider {
|
||||
|
||||
@Override
|
||||
public WallVisitor createWallVisitor() {
|
||||
return new SQLServerWallVisitor(config);
|
||||
return new SQLServerWallVisitor(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -27,20 +27,23 @@ import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitorAdapter;
|
||||
import com.alibaba.druid.wall.Violation;
|
||||
import com.alibaba.druid.wall.WallConfig;
|
||||
import com.alibaba.druid.wall.WallProvider;
|
||||
import com.alibaba.druid.wall.WallVisitor;
|
||||
import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation;
|
||||
|
||||
|
||||
public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements WallVisitor, SQLServerASTVisitor{
|
||||
public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements WallVisitor, SQLServerASTVisitor {
|
||||
|
||||
private final WallConfig config;
|
||||
private final WallProvider provider;
|
||||
private final List<Violation> violations = new ArrayList<Violation>();
|
||||
|
||||
/**
|
||||
* @param config
|
||||
*/
|
||||
public SQLServerWallVisitor(WallConfig config) {
|
||||
this.config = config;
|
||||
|
||||
public SQLServerWallVisitor(WallProvider provider) {
|
||||
this.config = provider.getConfig();
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
public WallProvider getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -55,10 +58,10 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements
|
||||
|
||||
@Override
|
||||
public boolean isPermitTable(String name) {
|
||||
if(!config.isTableCheck()){
|
||||
if (!config.isTableCheck()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
name = WallVisitorUtils.form(name);
|
||||
return config.getPermitTables().contains(name);
|
||||
}
|
||||
@@ -67,7 +70,6 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements
|
||||
public String toSQL(SQLObject obj) {
|
||||
return SQLUtils.toSQLServerString(obj);
|
||||
}
|
||||
|
||||
|
||||
public boolean visit(SQLIdentifierExpr x) {
|
||||
String name = x.getName();
|
||||
@@ -82,7 +84,7 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements
|
||||
WallVisitorUtils.check(this, x);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public boolean visit(SQLInListExpr x) {
|
||||
WallVisitorUtils.check(this, x);
|
||||
return true;
|
||||
@@ -147,7 +149,7 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements
|
||||
} else if (x instanceof SQLUpdateStatement) {
|
||||
} else if (x instanceof SQLTruncateStatement) {
|
||||
if (!config.isTruncateAllow()) {
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
}
|
||||
} else {
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
@@ -186,7 +188,7 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public boolean visit(SQLVariantRefExpr x) {
|
||||
String varName = x.getName();
|
||||
if (varName == null) {
|
||||
@@ -199,7 +201,7 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLServerObjectReferenceExpr x) {
|
||||
if (x.getSchema() != null && config.isPermitSchema(x.getSchema())) {
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||
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;
|
||||
import com.alibaba.druid.sql.visitor.ExportParameterVisitor;
|
||||
import com.alibaba.druid.util.JdbcUtils;
|
||||
import com.alibaba.druid.wall.WallVisitor;
|
||||
import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation;
|
||||
@@ -50,24 +51,11 @@ public class WallVisitorUtils {
|
||||
private final static Log LOG = LogFactory.getLog(WallVisitorUtils.class);
|
||||
|
||||
public static void check(WallVisitor visitor, SQLInListExpr x) {
|
||||
if (visitor.getConfig().isMustParameterized()) {
|
||||
for (SQLExpr param : x.getTargetList()) {
|
||||
if (getValue(param) != null) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void check(WallVisitor visitor, SQLBinaryOpExpr x) {
|
||||
if (x.getOperator().isRelational() && visitor.getConfig().isMustParameterized()) {
|
||||
if (x.getLeft() instanceof SQLName && getValue(x.getRight()) != null) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
} else if (x.getRight() instanceof SQLName && getValue(x.getLeft()) != null) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void check(WallVisitor visitor, SQLPropertyExpr x) {
|
||||
@@ -97,19 +85,34 @@ public class WallVisitorUtils {
|
||||
}
|
||||
|
||||
SQLExpr where = x.getWhere();
|
||||
if (where != null && Boolean.TRUE == getValue(where)) {
|
||||
if (where instanceof SQLBinaryOpExpr) {
|
||||
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) where;
|
||||
if (binaryOpExpr.getOperator() == SQLBinaryOperator.Equality
|
||||
|| binaryOpExpr.getOperator() == SQLBinaryOperator.NotEqual) {
|
||||
if (binaryOpExpr.getLeft() instanceof SQLIntegerExpr
|
||||
&& binaryOpExpr.getRight() instanceof SQLIntegerExpr) {
|
||||
return;
|
||||
}
|
||||
|
||||
// if (visitor.getConfig().isMustParameterized()) {
|
||||
if (where != null) {
|
||||
if (visitor.getConfig().isMustParameterized()) {
|
||||
ExportParameterVisitor exportParameterVisitor = visitor.getProvider().createExportParameterVisitor();
|
||||
where.accept(exportParameterVisitor);
|
||||
|
||||
if (exportParameterVisitor.getParameters().size() > 0) {
|
||||
addViolation(visitor, x);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
addViolation(visitor, x);
|
||||
if (Boolean.TRUE == getValue(where)) {
|
||||
if (where instanceof SQLBinaryOpExpr) {
|
||||
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) where;
|
||||
if (binaryOpExpr.getOperator() == SQLBinaryOperator.Equality
|
||||
|| binaryOpExpr.getOperator() == SQLBinaryOperator.NotEqual) {
|
||||
if (binaryOpExpr.getLeft() instanceof SQLIntegerExpr
|
||||
&& binaryOpExpr.getRight() instanceof SQLIntegerExpr) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user