This commit is contained in:
温少
2012-03-22 19:58:36 +08:00
parent 663474384d
commit e314df948d
6 changed files with 30 additions and 14 deletions
@@ -3,7 +3,6 @@ package com.alibaba.druid.sql.dialect.mysql.visitor;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.mapping.spi.ExportParameterVisitorUtils;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
@@ -13,6 +12,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.visitor.ExportParameterVisitor;
import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils;
public class MySqlExportParameterVisitor extends MySqlASTVisitorAdapter implements ExportParameterVisitor {
@@ -3,7 +3,6 @@ package com.alibaba.druid.sql.dialect.oracle.visitor;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.mapping.spi.ExportParameterVisitorUtils;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
@@ -12,6 +11,7 @@ import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.visitor.ExportParameterVisitor;
import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils;
public class OracleExportParameterVisitor extends OracleASTVIsitorAdapter implements ExportParameterVisitor {
@@ -3,7 +3,6 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.mapping.spi.ExportParameterVisitorUtils;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
@@ -12,6 +11,7 @@ import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.visitor.ExportParameterVisitor;
import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils;
public class MSSQLServerExportParameterVisitor extends SQLServerASTVisitorAdapter implements ExportParameterVisitor {
@@ -1,4 +1,4 @@
package com.alibaba.druid.mapping.spi;
package com.alibaba.druid.sql.visitor;
import java.util.List;
@@ -49,7 +49,7 @@ public class ExportParameterVisitorUtils {
}
public static void exportParameter(final List<Object> parameters, SQLBinaryOpExpr x) {
if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr) {
if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr && x.getOperator().isRelational()) {
return;
}
@@ -88,15 +88,7 @@ public class WallVisitorUtils {
// 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;
}
}
checkCondition(visitor, x.getWhere());
if (Boolean.TRUE == getValue(where)) {
if (where instanceof SQLBinaryOpExpr) {
@@ -144,6 +136,25 @@ public class WallVisitorUtils {
if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) {
addViolation(visitor, x);
return;
}
checkCondition(visitor, x.getWhere());
}
private static void checkCondition(WallVisitor visitor, SQLExpr x) {
if (x == null) {
return;
}
if (visitor.getConfig().isMustParameterized()) {
ExportParameterVisitor exportParameterVisitor = visitor.getProvider().createExportParameterVisitor();
x.accept(exportParameterVisitor);
if (exportParameterVisitor.getParameters().size() > 0) {
addViolation(visitor, x);
return;
}
}
}
@@ -183,7 +194,10 @@ public class WallVisitorUtils {
if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) {
addViolation(visitor, x);
return;
}
checkCondition(visitor, x.getWhere());
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@@ -18,6 +18,8 @@ public class MustParameterizedTest3 extends TestCase {
public void testMySql() throws Exception {
Assert.assertFalse(WallUtils.isValidateMySql("select * from t where id = (3 + 5 - 2 - 1)", config));
Assert.assertFalse(WallUtils.isValidateMySql("select * from t where id != id + 3", config));
Assert.assertFalse(WallUtils.isValidateMySql("delete from t where id != id + 3", config));
Assert.assertFalse(WallUtils.isValidateMySql("delete from t where id = 'aa' + 'bbb'", config));
Assert.assertTrue(WallUtils.isValidateMySql("select * from t where id = ? ORDER BY 1", config));
Assert.assertTrue(WallUtils.isValidateMySql("select 1, 2, 3 from t where id = ?", config));
}