mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
refactor
This commit is contained in:
@@ -9,6 +9,8 @@ import com.alibaba.druid.filter.wall.spi.WallVisitorUtils;
|
||||
|
||||
public class WallConfig {
|
||||
|
||||
private boolean noneBaseStatementAllow = false;
|
||||
|
||||
private boolean selelctAllow = true;
|
||||
private boolean selectIntoAllow = true;
|
||||
private boolean selectIntoOutfileAllow = false;
|
||||
@@ -25,6 +27,8 @@ public class WallConfig {
|
||||
private boolean insertAllow = true;
|
||||
private boolean mergeAllow = true;
|
||||
|
||||
private boolean truncateAllow = false;
|
||||
|
||||
private boolean shcemaCheck = true;
|
||||
private boolean tableCheck = true;
|
||||
private boolean functionCheck = true;
|
||||
@@ -76,6 +80,22 @@ public class WallConfig {
|
||||
loadResource(getPermitObjects(), dir + "/permit-object.txt");
|
||||
}
|
||||
|
||||
public boolean isNoneBaseStatementAllow() {
|
||||
return noneBaseStatementAllow;
|
||||
}
|
||||
|
||||
public void setNoneBaseStatementAllow(boolean noneBaseStatementAllow) {
|
||||
this.noneBaseStatementAllow = noneBaseStatementAllow;
|
||||
}
|
||||
|
||||
public boolean isTruncateAllow() {
|
||||
return truncateAllow;
|
||||
}
|
||||
|
||||
public void setTruncateAllow(boolean truncateAllow) {
|
||||
this.truncateAllow = truncateAllow;
|
||||
}
|
||||
|
||||
public boolean isSelelctAllow() {
|
||||
return selelctAllow;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ public interface WallVisitor extends SQLASTVisitor {
|
||||
|
||||
List<Violation> getViolations();
|
||||
|
||||
boolean containsPermitTable(String name);
|
||||
boolean isPermitTable(String name);
|
||||
|
||||
String toSQL(SQLObject obj);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
|
||||
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;
|
||||
@@ -142,7 +143,7 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
}
|
||||
|
||||
if (varName.startsWith("@@")) {
|
||||
violations.add(new IllegalSQLObjectViolation(SQLUtils.toMySqlString(x)));
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -168,7 +169,7 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
@Override
|
||||
public boolean visit(MySqlOutFileExpr x) {
|
||||
if (!config.isSelectIntoOutfileAllow()) {
|
||||
violations.add(new IllegalSQLObjectViolation(SQLUtils.toMySqlString(x)));
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -187,7 +188,7 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsPermitTable(String name) {
|
||||
public boolean isPermitTable(String name) {
|
||||
if (!config.isTableCheck()) {
|
||||
return false;
|
||||
}
|
||||
@@ -200,6 +201,10 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
if (!(x instanceof SQLStatement)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (config.isNoneBaseStatementAllow()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (x instanceof SQLInsertStatement) {
|
||||
|
||||
@@ -208,9 +213,13 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
} else if (x instanceof SQLDeleteStatement) {
|
||||
|
||||
} else if (x instanceof SQLUpdateStatement) {
|
||||
|
||||
|
||||
} else if (x instanceof SQLTruncateStatement) {
|
||||
if (!config.isTruncateAllow()) {
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
}
|
||||
} else {
|
||||
violations.add(new IllegalSQLObjectViolation(SQLUtils.toMySqlString(x)));
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,12 +16,12 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
|
||||
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;
|
||||
@@ -65,11 +65,6 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean visit(SQLDropTableStatement x) {
|
||||
violations.add(new IllegalSQLObjectViolation(SQLUtils.toOracleString(x)));
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLMethodInvokeExpr x) {
|
||||
WallVisitorUtils.checkFunction(this, x);
|
||||
@@ -124,7 +119,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsPermitTable(String name) {
|
||||
public boolean isPermitTable(String name) {
|
||||
if (!config.isTableCheck()) {
|
||||
return false;
|
||||
}
|
||||
@@ -141,6 +136,10 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
return;
|
||||
}
|
||||
|
||||
if (config.isNoneBaseStatementAllow()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (x instanceof SQLInsertStatement) {
|
||||
|
||||
} else if (x instanceof SQLSelectStatement) {
|
||||
@@ -149,10 +148,13 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
|
||||
} else if (x instanceof SQLUpdateStatement) {
|
||||
} else if (x instanceof OracleMultiInsertStatement) {
|
||||
|
||||
} else if (x instanceof OracleMergeStatement) {
|
||||
} else if (x instanceof SQLTruncateStatement) {
|
||||
if (!config.isTruncateAllow()) {
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
}
|
||||
} else {
|
||||
violations.add(new IllegalSQLObjectViolation(SQLUtils.toMySqlString(x)));
|
||||
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@ import com.alibaba.druid.filter.wall.IllegalSQLObjectViolation;
|
||||
import com.alibaba.druid.filter.wall.WallVisitor;
|
||||
import com.alibaba.druid.logging.Log;
|
||||
import com.alibaba.druid.logging.LogFactory;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
|
||||
@@ -51,14 +51,14 @@ public class WallVisitorUtils {
|
||||
String owner = x.getOwner().toString();
|
||||
owner = WallVisitorUtils.form(owner);
|
||||
if (visitor.getConfig().isPermitObjects(owner)) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkSelelct(WallVisitor visitor, SQLSelectQueryBlock x) {
|
||||
if (!visitor.getConfig().isSelectIntoAllow() && x.getInto() != null) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ public class WallVisitorUtils {
|
||||
}
|
||||
}
|
||||
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,13 +93,13 @@ public class WallVisitorUtils {
|
||||
}
|
||||
|
||||
if (Boolean.TRUE == getValue(x)) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkDelete(WallVisitor visitor, SQLDeleteStatement x) {
|
||||
if (!visitor.getConfig().isDeleteAllow()) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -108,13 +108,13 @@ public class WallVisitorUtils {
|
||||
}
|
||||
|
||||
if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkUpdate(WallVisitor visitor, SQLUpdateStatement x) {
|
||||
if (!visitor.getConfig().isUpdateAllow()) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ public class WallVisitorUtils {
|
||||
}
|
||||
|
||||
if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -399,7 +399,7 @@ public class WallVisitorUtils {
|
||||
String owner = x.getOwner().toString();
|
||||
owner = WallVisitorUtils.form(owner);
|
||||
if (visitor.getConfig().isPermitObjects(owner)) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -410,7 +410,7 @@ public class WallVisitorUtils {
|
||||
String methodName = x.getMethodName();
|
||||
|
||||
if (visitor.getConfig().isPermitFunction(methodName.toLowerCase())) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -428,7 +428,7 @@ public class WallVisitorUtils {
|
||||
ownerName = form(ownerName);
|
||||
|
||||
if (visitor.getConfig().getPermitSchemas().contains(ownerName.toLowerCase())) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -441,19 +441,23 @@ public class WallVisitorUtils {
|
||||
|
||||
if (tableName != null) {
|
||||
tableName = form(tableName);
|
||||
if (visitor.containsPermitTable(tableName)) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
if (visitor.isPermitTable(tableName)) {
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void addViolation(WallVisitor visitor, SQLObject x) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
}
|
||||
|
||||
public static void checkUnion(WallVisitor visitor, SQLUnionQuery x) {
|
||||
if (!visitor.getConfig().isSelectUnionCheck()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (WallVisitorUtils.queryBlockFromIsNull(x.getLeft()) || WallVisitorUtils.queryBlockFromIsNull(x.getRight())) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(SQLUtils.toMySqlString(x)));
|
||||
addViolation(visitor, x);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleExceptionStatement extends OracleSQLObjectImpl implements OracleStatement {
|
||||
public class OracleExceptionStatement extends OracleStatementImpl implements OracleStatement {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private List<Item> items = new ArrayList<Item>();
|
||||
|
||||
+1
-2
@@ -4,10 +4,9 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleGrantStatement extends OracleSQLObjectImpl implements OracleStatement {
|
||||
public class OracleGrantStatement extends OracleStatementImpl implements OracleStatement {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.alibaba.druid.bvt.filter.wall;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.filter.wall.WallConfig;
|
||||
import com.alibaba.druid.filter.wall.WallUtils;
|
||||
|
||||
/**
|
||||
* 这个场景,检测
|
||||
* @author wenshao
|
||||
*
|
||||
*/
|
||||
public class WallDropTest1 extends TestCase {
|
||||
private String sql = "DROP TABLE T1";
|
||||
|
||||
private WallConfig config = new WallConfig();
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
config.setNoneBaseStatementAllow(true);
|
||||
}
|
||||
|
||||
public void testMySql() throws Exception {
|
||||
Assert.assertTrue(WallUtils.isValidateMySql(sql, config));
|
||||
}
|
||||
|
||||
public void testORACLE() throws Exception {
|
||||
|
||||
Assert.assertTrue(WallUtils.isValidateOracle(sql, config));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.alibaba.druid.bvt.filter.wall;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.filter.wall.WallConfig;
|
||||
import com.alibaba.druid.filter.wall.WallUtils;
|
||||
|
||||
/**
|
||||
* 这个场景,检测
|
||||
* @author wenshao
|
||||
*
|
||||
*/
|
||||
public class WallTruncateTest extends TestCase {
|
||||
private String sql = "TRUNCATE TABLE T1";
|
||||
|
||||
private WallConfig config = new WallConfig();
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
//config.setTruncateAllow(true);
|
||||
}
|
||||
|
||||
public void testMySql() throws Exception {
|
||||
Assert.assertFalse(WallUtils.isValidateMySql(sql, config));
|
||||
}
|
||||
|
||||
public void testORACLE() throws Exception {
|
||||
|
||||
Assert.assertFalse(WallUtils.isValidateOracle(sql, config));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.alibaba.druid.bvt.filter.wall;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.filter.wall.WallConfig;
|
||||
import com.alibaba.druid.filter.wall.WallUtils;
|
||||
|
||||
/**
|
||||
* 这个场景,检测
|
||||
* @author wenshao
|
||||
*
|
||||
*/
|
||||
public class WallTruncateTest1 extends TestCase {
|
||||
private String sql = "TRUNCATE TABLE T1";
|
||||
|
||||
private WallConfig config = new WallConfig();
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
config.setTruncateAllow(true);
|
||||
}
|
||||
|
||||
public void testMySql() throws Exception {
|
||||
Assert.assertTrue(WallUtils.isValidateMySql(sql, config));
|
||||
}
|
||||
|
||||
public void testORACLE() throws Exception {
|
||||
|
||||
Assert.assertTrue(WallUtils.isValidateOracle(sql, config));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user