mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
sql wall
This commit is contained in:
@@ -21,9 +21,8 @@ import java.sql.Clob;
|
||||
import java.sql.NClob;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Savepoint;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
@@ -40,6 +39,7 @@ import com.alibaba.druid.logging.LogFactory;
|
||||
import com.alibaba.druid.proxy.jdbc.CallableStatementProxy;
|
||||
import com.alibaba.druid.proxy.jdbc.ConnectionProxy;
|
||||
import com.alibaba.druid.proxy.jdbc.DataSourceProxy;
|
||||
import com.alibaba.druid.proxy.jdbc.JdbcParameter;
|
||||
import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy;
|
||||
import com.alibaba.druid.proxy.jdbc.ResultSetProxy;
|
||||
import com.alibaba.druid.proxy.jdbc.StatementProxy;
|
||||
@@ -406,29 +406,32 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
|
||||
|
||||
long millis = nanoSpan / (1000 * 1000);
|
||||
if (millis >= slowSqlMillis) {
|
||||
List<String> lastSlowParameters = new ArrayList<String>();
|
||||
for (Object value : statement.getParameters().values()) {
|
||||
Map<Integer, JdbcParameter> parameters = statement.getParameters();
|
||||
String[] lastSlowParameters = new String[parameters.size()];
|
||||
int index = 0;
|
||||
for (JdbcParameter parameter : statement.getParameters().values()) {
|
||||
Object value = parameter.getValue();
|
||||
if (value == null) {
|
||||
lastSlowParameters.add("null");
|
||||
lastSlowParameters[index] = "null";
|
||||
} else if (value instanceof String) {
|
||||
lastSlowParameters.add("'" + value.toString() + "'");
|
||||
lastSlowParameters[index] = "'" + value.toString() + "'";
|
||||
} else if (value instanceof Number) {
|
||||
lastSlowParameters.add(value.toString());
|
||||
lastSlowParameters[index] = value.toString();
|
||||
} else if (value instanceof java.util.Date) {
|
||||
java.util.Date date = (java.util.Date) value;
|
||||
lastSlowParameters.add(date.getClass().getSimpleName() + "(" + date.getTime() + ")");
|
||||
lastSlowParameters[index] = date.getClass().getSimpleName() + "(" + date.getTime() + ")";
|
||||
} else if (value instanceof Boolean) {
|
||||
lastSlowParameters.add(value.toString());
|
||||
lastSlowParameters[index] = value.toString();
|
||||
} else if (value instanceof InputStream) {
|
||||
lastSlowParameters.add("<InputStream>");
|
||||
lastSlowParameters[index] = "<InputStream>";
|
||||
} else if (value instanceof Clob) {
|
||||
lastSlowParameters.add("<Clob>");
|
||||
lastSlowParameters[index] = "<Clob>";
|
||||
} else if (value instanceof NClob) {
|
||||
lastSlowParameters.add("<NClob>");
|
||||
lastSlowParameters[index] = "<NClob>";
|
||||
} else if (value instanceof Blob) {
|
||||
lastSlowParameters.add("<Blob>");
|
||||
lastSlowParameters[index] = "<Blob>";
|
||||
} else {
|
||||
lastSlowParameters.add("<" + value.getClass() + ">");
|
||||
lastSlowParameters[index] = "<" + value.getClass() + ">";
|
||||
}
|
||||
}
|
||||
sqlStat.setLastSlowParameters(lastSlowParameters);
|
||||
|
||||
@@ -9,9 +9,19 @@ public class WallUtils {
|
||||
MySqlWallProvider provider = new MySqlWallProvider();
|
||||
return provider.check(sql, false);
|
||||
}
|
||||
|
||||
|
||||
public static boolean isValidateMySql(String sql, WallConfig config) {
|
||||
MySqlWallProvider provider = new MySqlWallProvider(config);
|
||||
return provider.check(sql, false);
|
||||
}
|
||||
|
||||
public static boolean isValidateOracle(String sql) {
|
||||
OracleWallProvider provider = new OracleWallProvider();
|
||||
return provider.check(sql, false);
|
||||
}
|
||||
|
||||
public static boolean isValidateOracle(String sql, WallConfig config) {
|
||||
OracleWallProvider provider = new OracleWallProvider(config);
|
||||
return provider.check(sql, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,23 +89,13 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLDeleteStatement x) {
|
||||
if (!config.isDeleteAllow()) {
|
||||
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
|
||||
return false;
|
||||
}
|
||||
|
||||
WallVisitorUtils.checkDeleteCondition(this, x.getWhere());
|
||||
WallVisitorUtils.checkDelete(this, x);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLUpdateStatement x) {
|
||||
if (!config.isUpdateAllow()) {
|
||||
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
|
||||
return false;
|
||||
}
|
||||
|
||||
WallVisitorUtils.checkUpdateCondition(this, x.getWhere());
|
||||
WallVisitorUtils.checkUpdate(this, x);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -200,12 +200,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLDeleteStatement x) {
|
||||
if (!config.isDeleteAllow()) {
|
||||
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
|
||||
return false;
|
||||
}
|
||||
|
||||
WallVisitorUtils.checkDeleteCondition(this, x.getWhere());
|
||||
WallVisitorUtils.checkDelete(this, x);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -216,12 +211,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLUpdateStatement x) {
|
||||
if (!config.isUpdateAllow()) {
|
||||
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
|
||||
return false;
|
||||
}
|
||||
|
||||
WallVisitorUtils.checkUpdateCondition(this, x.getWhere());
|
||||
WallVisitorUtils.checkUpdate(this, x);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import com.alibaba.druid.sql.ast.expr.SQLNullExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
|
||||
@@ -36,6 +37,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
|
||||
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr;
|
||||
import com.alibaba.druid.util.JdbcUtils;
|
||||
|
||||
@@ -92,8 +94,9 @@ public class WallVisitorUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkDeleteCondition(WallVisitor visitor, SQLExpr x) {
|
||||
if (x == null) {
|
||||
public static void checkDelete(WallVisitor visitor, SQLDeleteStatement x) {
|
||||
if (!visitor.getConfig().isDeleteAllow()) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -101,22 +104,23 @@ public class WallVisitorUtils {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Boolean.TRUE == getValue(x)) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(SQLUtils.toSQLString(x)));
|
||||
if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkUpdateCondition(WallVisitor visitor, SQLExpr x) {
|
||||
if (x == null) {
|
||||
public static void checkUpdate(WallVisitor visitor, SQLUpdateStatement x) {
|
||||
if (!visitor.getConfig().isUpdateAllow()) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!visitor.getConfig().isUpdateWhereAlayTrueCheck()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Boolean.TRUE == getValue(x)) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(SQLUtils.toSQLString(x)));
|
||||
if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -395,11 +399,11 @@ public class WallVisitorUtils {
|
||||
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!visitor.getConfig().isFunctionCheck()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
String methodName = x.getMethodName();
|
||||
|
||||
if (visitor.getConfig().isPermitFunction(methodName.toLowerCase())) {
|
||||
|
||||
@@ -17,7 +17,6 @@ package com.alibaba.druid.stat;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
@@ -65,7 +64,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
|
||||
|
||||
private final AtomicLong inTransactionCount = new AtomicLong();
|
||||
|
||||
private List<String> lastSlowParameters;
|
||||
private String[] lastSlowParameters;
|
||||
|
||||
private final Histogram histogram = new Histogram(new long[] { //
|
||||
//
|
||||
@@ -78,11 +77,11 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
|
||||
this.sql = sql;
|
||||
}
|
||||
|
||||
public List<String> getLastSlowParameters() {
|
||||
public String[] getLastSlowParameters() {
|
||||
return lastSlowParameters;
|
||||
}
|
||||
|
||||
public void setLastSlowParameters(List<String> lastSlowParameters) {
|
||||
public void setLastSlowParameters(String[] lastSlowParameters) {
|
||||
this.lastSlowParameters = lastSlowParameters;
|
||||
}
|
||||
|
||||
@@ -391,7 +390,8 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
|
||||
SimpleType.STRING, //
|
||||
|
||||
// 25 -
|
||||
new ArrayType<Long>(SimpleType.LONG, true) //
|
||||
new ArrayType<Long>(SimpleType.LONG, true), //
|
||||
new ArrayType<Long>(SimpleType.STRING, true), //
|
||||
};
|
||||
|
||||
String[] indexNames = {
|
||||
@@ -431,7 +431,9 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
|
||||
"URL", //
|
||||
|
||||
// 25 -
|
||||
"Histogram" //
|
||||
"Histogram", //
|
||||
"LastSlowParameters"
|
||||
//
|
||||
};
|
||||
String[] indexDescriptions = indexNames;
|
||||
COMPOSITE_TYPE = new CompositeType("SqlStatistic", "Sql Statistic", indexNames, indexDescriptions, indexTypes);
|
||||
@@ -446,6 +448,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
|
||||
public Map<String, Object> getData() throws JMException {
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
|
||||
// 0 - 4
|
||||
map.put("ID", id);
|
||||
map.put("DataSource", dataSource);
|
||||
map.put("SQL", sql);
|
||||
@@ -487,6 +490,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
|
||||
map.put("InTransactionCount", getInTransactionCount());
|
||||
|
||||
map.put("Histogram", this.histogram.toArray());
|
||||
map.put("LastSlowParameters", lastSlowParameters);
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user