From 576b9763cfaab5c2f330a3f1d53097aa4f9ebff9 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 19 Dec 2012 20:17:36 +0800 Subject: [PATCH] improve WallFilter --- .../com/alibaba/druid/wall/WallConfig.java | 20 +++++++++ .../druid/wall/spi/MySqlWallVisitor.java | 3 ++ .../filter/wall/MySqlWallDescribteTest.java | 45 +++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallDescribteTest.java diff --git a/src/main/java/com/alibaba/druid/wall/WallConfig.java b/src/main/java/com/alibaba/druid/wall/WallConfig.java index d4a4f4d9eb..5d2a0ee35c 100644 --- a/src/main/java/com/alibaba/druid/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/wall/WallConfig.java @@ -51,6 +51,8 @@ public class WallConfig implements WallConfigMBean { private boolean commentAllow = false; + private boolean describeAllow = false; + private boolean schemaCheck = true; private boolean tableCheck = true; private boolean functionCheck = true; @@ -173,6 +175,24 @@ public class WallConfig implements WallConfigMBean { this.noneBaseStatementAllow = noneBaseStatementAllow; } + /** + * allow mysql describe statement + * @since 0.2.10 + * @return + */ + public boolean isDescribeAllow() { + return describeAllow; + } + + /** + * set allow mysql describe statement + * @since 0.2.10 + * @return + */ + public void setDescribeAllow(boolean describeAllow) { + this.describeAllow = describeAllow; + } + public boolean isTruncateAllow() { return truncateAllow; } diff --git a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java index abcde60695..2df999daac 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java @@ -41,6 +41,7 @@ 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; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDescribeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectGroupBy; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; @@ -259,6 +260,8 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi allow = true; } else if (x instanceof SQLTruncateStatement) { allow = config.isTruncateAllow(); + } else if (x instanceof MySqlDescribeStatement) { + allow = config.isDescribeAllow(); } if (!allow) { diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallDescribteTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallDescribteTest.java new file mode 100644 index 0000000000..f65ee3ba25 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallDescribteTest.java @@ -0,0 +1,45 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +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; + +/** + * 这个场景测试访问Oracle系统对象 + * + * @author admin + */ +public class MySqlWallDescribteTest extends TestCase { + + public void test_allow() throws Exception { + WallConfig config = new WallConfig(); + config.setDescribeAllow(true); + + Assert.assertTrue(WallUtils.isValidateMySql("describe t", config)); + } + + public void test_not_allow() throws Exception { + WallConfig config = new WallConfig(); + config.setVariantCheck(true); + + Assert.assertFalse(WallUtils.isValidateMySql("describe t", config)); + } +}