【发布时间】:2016-03-15 04:09:31
【问题描述】:
我已经尝试在 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{...}
编写规则后,我想对其进行测试,但很快意识到我必须将其包装在插件中才能这样做。我为此编写了三个额外的类,完全基于provided example plugin。这是基类:
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();
}
}
就像我说的,这些几乎都是从示例插件中删除的,所以我不知道它们可能有什么问题。
我正在使用带有 M2E 的 Eclipse 来尝试构建插件。正如文档的Coding A Plugin 页面所建议的那样,我在我的 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>
现在,根据我读过的所有内容,我应该能够构建项目(右键单击项目 > 运行方式 > Maven 构建(目标为“包”)并将生成的 .jar 放入 SONAR_HOME/扩展/插件,当我重新启动服务器时,规则(和存储库)应该在那里。但是,无论我尝试什么,它都不存在。我花了几个小时梳理互联网并尝试我找到的任何东西,但规则永远不会出现在 UI 中。
我错过了什么吗?我做错了什么吗?我的代码是否不正确或遗漏了什么?
感谢您阅读这篇怪物帖子。您的任何建议都很有价值,因为我没有想法。
【问题讨论】:
-
我是 java 插件的主要维护者。我们对您在 OWASP 方面所做的工作非常感兴趣,因为我们还希望针对 Owasp 前 10 条规则(您可能已经注意到)。您介意与 sonarqube@googlegroups.com 联系,以便我们讨论您想要实现的目标吗?
-
关于您的问题:您是否尝试从示例项目开始并使其工作?您介意分享您的资源吗?
标签: java eclipse maven sonarqube