From a524882bd87c9e298f270aac22f57c219b252e85 Mon Sep 17 00:00:00 2001 From: sunzhengfang Date: Thu, 28 Sep 2017 11:05:31 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=20#2000=20=E4=BD=9C=E4=B8=BAfirewall?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=9C=A8mysql=E4=B8=8A=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99lock=20tables=20..=20write=E8=BF=87=E4=B8=8D=E4=BA=86?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mysql/parser/MySqlStatementParser.java | 2 + .../test/wall/MySqlResourceWallTest.java | 50 +++++++++++++++---- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 81f0d243fb..a23b71a0cf 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -597,10 +597,12 @@ public class MySqlStatementParser extends SQLStatementParser { stmt.setLockType(LockType.READ); } } else if (lexer.identifierEquals(WRITE)) { + lexer.nextToken(); stmt.setLockType(LockType.WRITE); } else if (lexer.identifierEquals(FnvHash.Constants.LOW_PRIORITY)) { lexer.nextToken(); acceptIdentifier(WRITE); + lexer.nextToken(); stmt.setLockType(LockType.LOW_PRIORITY_WRITE); } else { throw new ParserException("syntax error, expect READ or WRITE, actual " + lexer.token() + ", " + lexer.info()); diff --git a/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java b/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java index 3e5920f707..91ef3583f7 100644 --- a/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java +++ b/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java @@ -25,25 +25,19 @@ import com.alibaba.druid.wall.Violation; import com.alibaba.druid.wall.WallCheckResult; import com.alibaba.druid.wall.WallProvider; import com.alibaba.druid.wall.spi.MySqlWallProvider; +import org.junit.Assert; +import org.junit.Test; public class MySqlResourceWallTest extends TestCase { private String[] items; - protected void setUp() throws Exception { -// File file = new File("/home/wenshao/error_sql"); - File file = new File("/home/wenshao/scan_result"); - FileInputStream is = new FileInputStream(file); - String text = Utils.read(is); - is.close(); - items = text.split("\\|\\n\\|"); - } public void test_false() throws Exception { WallProvider provider = new MySqlWallProvider(); - + provider.getConfig().setConditionDoubleConstAllow(true); - + provider.getConfig().setUseAllow(true); provider.getConfig().setStrictSyntaxCheck(false); provider.getConfig().setMultiStatementAllow(true); @@ -76,4 +70,40 @@ public class MySqlResourceWallTest extends TestCase { // Assert.assertFalse(provider.checkValid(sql)); } + + + @Test + public void test_lock_table() throws Exception { + WallProvider provider = new MySqlWallProvider(); + provider.getConfig().setNoneBaseStatementAllow(true); + + String sql = "lock tables etstsun write"; + WallCheckResult result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + + sql = "lock tables etstsun LOW_PRIORITY write"; + result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + + sql = "UNLOCK TABLES"; + result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + + } + } From b1dadc709df1e15689f75ad917909b0f5db2ac9d Mon Sep 17 00:00:00 2001 From: sunzhengfang Date: Thu, 28 Sep 2017 11:09:13 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=20#2000=20=E4=BD=9C=E4=B8=BAfirewall?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=9C=A8mysql=E4=B8=8A=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99lock=20tables=20..=20write=E8=BF=87=E4=B8=8D=E4=BA=86?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../druid/test/wall/MySqlResourceWallTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java b/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java index 91ef3583f7..e5bb146e42 100644 --- a/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java +++ b/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java @@ -104,6 +104,24 @@ public class MySqlResourceWallTest extends TestCase { Assert.assertTrue(provider.checkValid(sql)); + sql = "lock table dsdfsdf read"; + result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + + sql = "lock table dsdfsdf read local"; + result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + } }