diff --git a/src/main/java/com/alibaba/druid/wall/WallConfig.java b/src/main/java/com/alibaba/druid/wall/WallConfig.java index ac0fb0a2a6..7d1e94f186 100644 --- a/src/main/java/com/alibaba/druid/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/wall/WallConfig.java @@ -29,6 +29,8 @@ public class WallConfig { private boolean truncateAllow = false; + private boolean commentAllow = false; + private boolean schemaCheck = true; private boolean tableCheck = true; private boolean functionCheck = true; @@ -238,6 +240,14 @@ public class WallConfig { // /////////////////// + public boolean isCommentAllow() { + return commentAllow; + } + + public void setCommentAllow(boolean commentAllow) { + this.commentAllow = commentAllow; + } + public Set getPermitFunctions() { return permitFunctions; } diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index ee11378342..ca0c5790a4 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; +import java.util.concurrent.locks.ReentrantReadWriteLock; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.parser.ParserException; @@ -19,10 +20,12 @@ public abstract class WallProvider { private int whileListMaxSize = 1024; - private int whiteSqlMaxLength = 1024; // 1k + private int whiteSqlMaxLength = 1024; // 1k protected final WallConfig config; + private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + public WallProvider(WallConfig config){ this.config = config; } @@ -31,26 +34,36 @@ public abstract class WallProvider { return config; } - public synchronized void addWhiteSql(String sql) { - if (whiteList == null) { - whiteList = new LinkedHashMap(whileListMaxSize, 0.75f, true); - } + public void addWhiteSql(String sql) { + lock.writeLock().lock(); + try { + if (whiteList == null) { + whiteList = new LinkedHashMap(whileListMaxSize, 0.75f, true); + } - whiteList.put(sql, PRESENT); + whiteList.put(sql, PRESENT); + } finally { + lock.writeLock().unlock(); + } } - public synchronized boolean whiteContains(String sql) { - if (whiteList == null) { - return false; - } + public boolean whiteContains(String sql) { + lock.readLock().lock(); + try { + if (whiteList == null) { + return false; + } - return whiteList.get(sql) != null; + return whiteList.get(sql) != null; + } finally { + lock.readLock().unlock(); + } } public abstract SQLStatementParser createParser(String sql); public abstract WallVisitor createWallVisitor(); - + public boolean checkValid(String sql) { return check(sql).size() == 0; } @@ -63,7 +76,10 @@ public abstract class WallProvider { } SQLStatementParser parser = createParser(sql); - parser.getLexer().setAllowComment(false); // permit comment + + if (!config.isCommentAllow()) { + parser.getLexer().setAllowComment(false); // permit comment + } List statementList = new ArrayList(); diff --git a/src/main/resources/META-INF/druid/wall/sqlserver/permit-table.txt b/src/main/resources/META-INF/druid/wall/sqlserver/permit-table.txt index c2b14c048c..9ec6dc3f53 100644 --- a/src/main/resources/META-INF/druid/wall/sqlserver/permit-table.txt +++ b/src/main/resources/META-INF/druid/wall/sqlserver/permit-table.txt @@ -55,44 +55,44 @@ backupset sysdatabases sysservers sysreplicationalerts -MSagent_parameters -Mspublisher_databases -MSagent_profiles -MSreplication_objects -MSarticles -MSreplication_subscriptions -MSdistpublishers -MSrepl_commands -MSdistributiondbs -MSrepl_errors -MSdistribution_agents -MSrepl_originators -MSdistribution_history -MSrepl_transactions -MSdistributor -MSrepl_version -MSlogreader_agents -MSsnapshot_agents -MSlogreader_history -MSsnapshot_history -MSmerge_agents -MSsubscriber_info -MSmerge_history -MSsubscriber_schedule -MSmerge_subscriptions -MSsubscriptions -MSpublication_access -MSsubscription_properties -Mspublications -MSmerge_contents +msagent_parameters +mspublisher_databases +msagent_profiles +msreplication_objects +msarticles +msreplication_subscriptions +msdistpublishers +msrepl_commands +msdistributiondbs +msrepl_errors +msdistribution_agents +msrepl_originators +msdistribution_history +msrepl_transactions +msdistributor +msrepl_version +mslogreader_agents +mssnapshot_agents +mslogreader_history +mssnapshot_history +msmerge_agents +mssubscriber_info +msmerge_history +mssubscriber_schedule +msmerge_subscriptions +mssubscriptions +mspublication_access +mssubscription_properties +mspublications +msmerge_contents sysmergearticles -MSmerge_delete_conflicts +msmerge_delete_conflicts sysmergepublications -MSmerge_genhistory +msmerge_genhistory sysmergeschemachange -MSmerge_replinfo +msmerge_replinfo sysmergesubscriptions -MSmerge_tombstone +msmerge_tombstone sysmergesubsetfilters sysarticles syspublications diff --git a/src/test/resources/com/alibaba/druid/pool/spring-config-1.xml b/src/test/resources/com/alibaba/druid/pool/spring-config-1.xml index 65bb5086b2..40e604ac01 100644 --- a/src/test/resources/com/alibaba/druid/pool/spring-config-1.xml +++ b/src/test/resources/com/alibaba/druid/pool/spring-config-1.xml @@ -22,7 +22,7 @@ http://www.springframework.org/schema/aop http://www.springframework.org/schema/ - jdbc:mock: