This commit is contained in:
温少
2012-03-22 19:18:04 +08:00
parent d3a2ac1c68
commit 663474384d
11 changed files with 108 additions and 60 deletions
@@ -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);
}
}
}