This commit is contained in:
温少
2012-03-20 14:37:13 +08:00
parent 5192ca92d9
commit e50f491caa
8 changed files with 51 additions and 12 deletions
@@ -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);
}
}
}
}
@@ -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.<Violation> singletonList(new IllegalSQLObjectViolation(sql));
} catch (Exception e) {
return Collections.<Violation> singletonList(new SyntaxErrorViolation(e, sql));
}
if (parser.getLexer().token() != Token.EOF) {
@@ -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 {
@@ -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 {
@@ -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{
@@ -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 {
@@ -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 {
@@ -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;
}
}