我已经尝试在SonarQube上实现我自己的自定义Java规则很长一段时间了。然而,似乎无论我尝试什么,我都无法在SonarQube UI上显示新规则。
我现在只有一条规则,一条安全规则,用于检查文本输出是否已净化。该规则扩展了BaseTreeVisitor并实现了JavaFileScanner。它重写visitMethodInvocation以对相关方法的String参数进行一些检查。以下是规则定义注释:
@Rule(key = "Sanitize_HTML",
name = "HTML Responses Should be Sanitized",
tags = {"security", "owasp-a3"},
priority = Priority.CRITICAL)
@ActivatedByDefault
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.SECURITY_FEATURES)
@SqaleConstantRemediation("10min")
public class SanitizeHTMLCheck extends BaseTreeVisitor implements JavaFileScanner{...}
写完规则后,我想测试它,但很快意识到我必须将它封装在一个插件中才能做到这一点。我为此写了三个额外的类,完全基于提供的示例插件。这是基类:
public class SecurityPlugin extends SonarPlugin{
public List getExtensions(){
return Arrays.asList(
JavaClasspath.class,
JavaTestClasspath.class,
Java.class,
SecurityRulesDefinition.class,
SonarComponents.class,
DefaultJavaResourceLocator.class);
}
}
除了SecurityRulesDefinition之外,列表中的类都是不相关的(在绝望中添加的)。它反映了示例中MyJavaRulesDefinition类的结构:
public class SecurityRulesDefinition implements RulesDefinition{
public void define(Context context){
NewRepository repository = context
.createRepository(RulesList.REPOSITORY_KEY, Java.KEY)
.setName("Security Rules");
AnnotationBasedRulesDefinition.load(repository, Java.KEY, RulesList.getChecks());
for(NewRule rule : repository.rules()){
rule.setInternalKey(rule.key());
}
repository.done();
}
}
最后,就像这个例子一样,这里是RulesList,我所有的规则类都应该放在那里:
public class RulesList {
public static final String REPOSITORY_KEY = "security_java";
private RulesList(){}
public static List<Class> getChecks(){
return ImmutableList.<Class>builder().addAll(getJavaChecks()).addAll(getJavaTestChecks()).build();
}
//Add all checks to here...
public static List<Class<? extends JavaCheck>> getJavaChecks(){
return ImmutableList.<Class<? extends JavaCheck>>builder()
.add(SanitizeHTMLCheck.class)
.build();
}
//Put all test checks here
public static List<Class<? extends JavaCheck>> getJavaTestChecks(){
return ImmutableList.<Class<? extends JavaCheck>>builder()
.build();
}
}
就像我说的,这些都是从示例插件中撕下来的,所以我不知道它们可能出了什么问题。
我正在使用Eclipse和M2E来尝试构建插件。根据文档的"编码插件"页面的建议,我在POM.xml中添加了以下插件标签:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.sonar</groupId>
<artifactId>sonar-packaging-maven-plugin</artifactId>
<version>1.13</version>
<extensions>true</extensions>
<configuration>
<pluginKey>securityrules</pluginKey>
<pluginClass>org.myOrg.sonar_analysis.security_rules_java.SecurityPlugin</pluginClass>
<pluginName>Sonar Java Custom Security Rules</pluginName>
<pluginDescription>Implements several checks against OWASP-Top-10 vulnerabilities.</pluginDescription>
</configuration>
</plugin>
</plugins>
</build>
现在,根据我所读到的内容,我应该能够构建项目(右键单击项目>Run As>Maven build(目标为"package"),并将生成的.jar放入SONAR_HOME/extensions/plugins中,当我重新启动服务器时,规则(和存储库)应该在那里。然而,无论我尝试什么,它都不存在。我花了几个小时在互联网上搜索,尝试我找到的任何东西,但这个规则从未出现在UI中。
我是不是错过了什么?我做错什么了吗?我的代码是错误的还是遗漏了什么?
感谢您阅读这篇怪兽帖。你的任何建议都很有价值,因为我没有主意。
代码的结构似乎对我来说(或多或少)是正确的。在SecurityPlugin类中,您可以返回许多类(JavaClasspath.class、JavaTestClasspath.cclass等)。。。它们是干什么的?他们实施/扩展了什么?在我看来,你需要回到那里:-a"规则定义"(参见SonarQube中的规则)和-CheckRegister(允许使用支票)。也许我的小规则项目会给你一些想法(https://github.com/arxes-tolina/sonar-plugins;一个规则带有两个检查)。如果您仍在与规则作斗争,请尝试将sonar.log.level-property(./conf/sonar.properties)设置为DEBUG,并观看SonarQube的启动。