From e50f491caa752cd92ad7393414ad37b28279a0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Tue, 20 Mar 2012 14:37:13 +0800 Subject: [PATCH] refactor --- .../com/alibaba/druid/wall/WallFilter.java | 16 ++++++---- .../com/alibaba/druid/wall/WallProvider.java | 6 ++-- .../druid/wall/spi/MySqlWallVisitor.java | 2 +- .../druid/wall/spi/OracleWallVisitor.java | 2 +- .../druid/wall/spi/SQLServerWallVisitor.java | 2 +- .../druid/wall/spi/WallVisitorUtils.java | 2 +- .../IllegalSQLObjectViolation.java | 4 ++- .../wall/violation/SyntaxErrorViolation.java | 29 +++++++++++++++++++ 8 files changed, 51 insertions(+), 12 deletions(-) rename src/main/java/com/alibaba/druid/wall/{ => violation}/IllegalSQLObjectViolation.java (80%) create mode 100644 src/main/java/com/alibaba/druid/wall/violation/SyntaxErrorViolation.java diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index abad1d349e..ffcfdc0d7e 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -20,6 +20,7 @@ import com.alibaba.druid.util.JdbcUtils; import com.alibaba.druid.wall.spi.MySqlWallProvider; import com.alibaba.druid.wall.spi.OracleWallProvider; import com.alibaba.druid.wall.spi.SQLServerProvider; +import com.alibaba.druid.wall.violation.SyntaxErrorViolation; public class WallFilter extends FilterAdapter implements WallFilterMBean { @@ -48,19 +49,19 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { if (config == null) { config = new WallConfig(MySqlWallProvider.DEFAULT_CONFIG_DIR); } - + provider = new MySqlWallProvider(config); } else if (JdbcUtils.ORACLE.equals(dbType)) { if (config == null) { config = new WallConfig(OracleWallProvider.DEFAULT_CONFIG_DIR); } - + provider = new OracleWallProvider(config); } else if (JdbcUtils.SQL_SERVER.equals(dbType)) { if (config == null) { config = new WallConfig(SQLServerProvider.DEFAULT_CONFIG_DIR); } - + provider = new SQLServerProvider(config); } else { throw new IllegalStateException("dbType not support : " + dbType); @@ -128,7 +129,7 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { throw new DruidRuntimeException("wall filter is inited"); } } - + @Override public void statement_addBatch(FilterChain chain, StatementProxy statement, String sql) throws SQLException { check(sql); @@ -275,7 +276,12 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { } if (throwException) { - throw new SQLException("sql injection violation : " + sql); + if (violations.get(0) instanceof SyntaxErrorViolation) { + SyntaxErrorViolation violation = (SyntaxErrorViolation) violations.get(0); + throw new SQLException("sql injection violation : " + sql, violation.getException()); + } else { + throw new SQLException("sql injection violation : " + sql); + } } } } diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index 31e5c53093..b393167e58 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -12,6 +12,8 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.sql.parser.Token; +import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation; +import com.alibaba.druid.wall.violation.SyntaxErrorViolation; public abstract class WallProvider { @@ -112,8 +114,8 @@ public abstract class WallProvider { try { parser.parseStatementList(statementList); - } catch (ParserException e) { - return Collections. singletonList(new IllegalSQLObjectViolation(sql)); + } catch (Exception e) { + return Collections. singletonList(new SyntaxErrorViolation(e, sql)); } if (parser.getLexer().token() != Token.EOF) { 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 ef8be00e3b..3f1bcc5b56 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java @@ -29,10 +29,10 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter; -import com.alibaba.druid.wall.IllegalSQLObjectViolation; import com.alibaba.druid.wall.Violation; import com.alibaba.druid.wall.WallConfig; import com.alibaba.druid.wall.WallVisitor; +import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation; public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisitor, MySqlASTVisitor { diff --git a/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java index b9da0a04c5..b133741d67 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java @@ -29,10 +29,10 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVIsitorAdapter; -import com.alibaba.druid.wall.IllegalSQLObjectViolation; import com.alibaba.druid.wall.Violation; import com.alibaba.druid.wall.WallConfig; import com.alibaba.druid.wall.WallVisitor; +import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation; public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVisitor { diff --git a/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java index 39502db3bb..631b8e33a2 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java @@ -24,10 +24,10 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitorAdapter; -import com.alibaba.druid.wall.IllegalSQLObjectViolation; import com.alibaba.druid.wall.Violation; import com.alibaba.druid.wall.WallConfig; import com.alibaba.druid.wall.WallVisitor; +import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation; public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements WallVisitor, SQLServerASTVisitor{ diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index e2a53c8932..b0c2996c07 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -40,8 +40,8 @@ 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.MySqlBooleanExpr; import com.alibaba.druid.util.JdbcUtils; -import com.alibaba.druid.wall.IllegalSQLObjectViolation; import com.alibaba.druid.wall.WallVisitor; +import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation; public class WallVisitorUtils { diff --git a/src/main/java/com/alibaba/druid/wall/IllegalSQLObjectViolation.java b/src/main/java/com/alibaba/druid/wall/violation/IllegalSQLObjectViolation.java similarity index 80% rename from src/main/java/com/alibaba/druid/wall/IllegalSQLObjectViolation.java rename to src/main/java/com/alibaba/druid/wall/violation/IllegalSQLObjectViolation.java index e56a0b768c..b6f09c36ba 100644 --- a/src/main/java/com/alibaba/druid/wall/IllegalSQLObjectViolation.java +++ b/src/main/java/com/alibaba/druid/wall/violation/IllegalSQLObjectViolation.java @@ -1,4 +1,6 @@ -package com.alibaba.druid.wall; +package com.alibaba.druid.wall.violation; + +import com.alibaba.druid.wall.Violation; public class IllegalSQLObjectViolation implements Violation { diff --git a/src/main/java/com/alibaba/druid/wall/violation/SyntaxErrorViolation.java b/src/main/java/com/alibaba/druid/wall/violation/SyntaxErrorViolation.java new file mode 100644 index 0000000000..0e9f647c77 --- /dev/null +++ b/src/main/java/com/alibaba/druid/wall/violation/SyntaxErrorViolation.java @@ -0,0 +1,29 @@ +package com.alibaba.druid.wall.violation; + +import com.alibaba.druid.wall.Violation; + +public class SyntaxErrorViolation implements Violation { + + private final Exception exception; + + private final String sql; + + public SyntaxErrorViolation(Exception exception, String sql){ + super(); + this.exception = exception; + this.sql = sql; + } + + public String toString() { + return this.sql; + } + + public Exception getException() { + return exception; + } + + public String getSql() { + return sql; + } + +}