From 0163cb488a8ef6343d8b70e2ee7a453a0ae426dd Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 18 Mar 2013 20:17:55 +0800 Subject: [PATCH] WallConfig support strictSyntaxCheck --- .../sqlserver/parser/SQLServerExprParser.java | 1 - .../com/alibaba/druid/wall/WallConfig.java | 9 ++++++++ .../com/alibaba/druid/wall/WallProvider.java | 5 ++++ .../filter/wall/StrictSyntaxCheckTest.java | 23 +++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/StrictSyntaxCheckTest.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java index 04a3fbf0d6..6d2a348af4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java @@ -22,7 +22,6 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLExprParser; -import com.alibaba.druid.sql.parser.SQLSelectParser; import com.alibaba.druid.sql.parser.Token; public class SQLServerExprParser extends SQLExprParser { diff --git a/src/main/java/com/alibaba/druid/wall/WallConfig.java b/src/main/java/com/alibaba/druid/wall/WallConfig.java index 2f3809bf29..e57aa285d9 100644 --- a/src/main/java/com/alibaba/druid/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/wall/WallConfig.java @@ -50,6 +50,7 @@ public class WallConfig implements WallConfigMBean { private boolean truncateAllow = false; private boolean commentAllow = false; + private boolean strictSyntaxCheck = true; private boolean describeAllow = false; @@ -357,6 +358,14 @@ public class WallConfig implements WallConfigMBean { this.commentAllow = commentAllow; } + public boolean isStrictSyntaxCheck() { + return strictSyntaxCheck; + } + + public void setStrictSyntaxCheck(boolean strictSyntaxCheck) { + this.strictSyntaxCheck = strictSyntaxCheck; + } + public Set getDenyFunctions() { return denyFunctions; } diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index fdd83c6544..d34846201f 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -260,6 +260,11 @@ public abstract class WallProvider { result.getViolations().add(new SyntaxErrorViolation(e, sql)); incrementCommentDeniedCount(); return result; + } catch (ParserException e) { + if (config.isStrictSyntaxCheck()) { + result.getViolations().add(new SyntaxErrorViolation(e, sql)); + } + return result; } catch (Exception e) { result.getViolations().add(new SyntaxErrorViolation(e, sql)); return result; diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/StrictSyntaxCheckTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/StrictSyntaxCheckTest.java new file mode 100644 index 0000000000..1796272f21 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/StrictSyntaxCheckTest.java @@ -0,0 +1,23 @@ +package com.alibaba.druid.bvt.filter.wall; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.wall.WallConfig; +import com.alibaba.druid.wall.WallUtils; + +public class StrictSyntaxCheckTest extends TestCase { + + public void test_syntax() throws Exception { + Assert.assertFalse(WallUtils.isValidateMySql(// + "SELECT SELECT")); // 部分永真 + } + + public void test_syntax_1() throws Exception { + WallConfig config = new WallConfig(); + config.setStrictSyntaxCheck(false); + Assert.assertTrue(WallUtils.isValidateMySql(// + "SELECT SELECT", config)); // 部分永真 + } +}