首页 > 其他分享 >sonarqube添加一条自定义规则,扫描文件中出现的username和password,方法二,使用implements Sensor

sonarqube添加一条自定义规则,扫描文件中出现的username和password,方法二,使用implements Sensor

时间:2024-08-19 14:40:23浏览次数:14  
标签:username java 自定义 sonarqube Rule api org sonar import

特别指出:

 所以,sonarqube默认过滤掉了resources下的文件;

以下代码可以扫出yml / xml /properties 等文件中的敏感字符,当然是放在src/main下的,不是resources;

下载源码与使用详情参考:

Sonarqube 自定义规则,部署SonarSource / sonar-java源码中示例规则:docs/java-custom-rules-example - yxchun - 博客园 (cnblogs.com)

假设你已经有了sonarqube-java源码,并且已经把sonarqube部署到电脑上;因为我的代码是基于SonarSource / sonar-java源码中示例项目docs/java-custom-rules-example

就进行如下步骤:

1、创建CustomNameCheck 

package org.sonar.samples.java.custom;

import org.sonar.api.batch.fs.FileSystem;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.TextRange;
import org.sonar.api.batch.sensor.Sensor;
import org.sonar.api.batch.sensor.SensorContext;
import org.sonar.api.batch.sensor.SensorDescriptor;
import org.sonar.api.batch.sensor.issue.NewIssue;
import org.sonar.api.batch.sensor.issue.NewIssueLocation;
import org.sonar.api.rule.RuleKey;
import org.sonar.check.Rule;
import org.sonar.plugins.java.api.JavaCheck;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Pattern;


@Rule(key = "CustomName")
//@Rule(key = "CustomName",name = "Custom Sensitive Information Rule  txt txt",description = "ddddddddddddddddddddddddddd",tags = { "bugs", "gandalf", "magic"},priority = Priority.CRITICAL)
public class CustomNameCheck implements Sensor ,JavaCheck{

  private static final Pattern SENSITIVE_PATTERN = Pattern.compile(".*(username|password).*", Pattern.CASE_INSENSITIVE);
//  private final FileSystem fs;

  @Override
  public void describe(SensorDescriptor descriptor) {
//    System.out.println("------------------------------describe--");
    descriptor.name("Hardcoding is not allowed, username or password")
      .onlyOnLanguage("java");
  }
  
  @Override
  public void execute(SensorContext context) {
//    System.out.println("------------------------------execute--");
    FileSystem fileSystem = context.fileSystem();
    Iterable<InputFile> inputFiles = fileSystem.inputFiles(fileSystem.predicates().all());
    String absolutePath;
    for(InputFile input:inputFiles ){
       absolutePath = input.absolutePath();
      try {
        scanFile(input,context,absolutePath);
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
    }
  }

  private void scanFile(InputFile inputFile, SensorContext context,String absolutePath) throws IOException {
//    System.out.println("---------------------scanFile----" + absolutePath);
    try(BufferedReader reader = new BufferedReader(new FileReader(absolutePath))) {
      String line;
      int lineNumber = 0;
      while ((line = reader.readLine()) != null) {
        lineNumber++;
        if (SENSITIVE_PATTERN.matcher(line.toLowerCase()).matches()) {
          NewIssue newIssue = context.newIssue().forRule(RuleKey.of("mycompany-java", "CustomName"));
          TextRange range = inputFile.newRange(lineNumber, 0, lineNumber, line.length());
          NewIssueLocation newIssueLocation = newIssue.newLocation()
            .on(inputFile)
            .message("Hardcoding is not allowed, username or password").at(range);
          newIssue.at(newIssueLocation).save();
        }
      }
    }
  }
}

2、将CustomNameCheck 加入到RulesList

 3、编写.html  .json文件

CustomName.html如下

<!DOCTYPE html>
<html>
<head>
  <title>Custom Sensitive Information Rule - implements Sensor</title>
</head>
<body>
<h1>Sensitive Information Rule TXT TXT</h1>
<p>This rule detects hardcoded sensitive information such as 'username' or 'password' in the code.</p>

<h2>Rule Description</h2>
<p>Hardcoding sensitive information can lead to security vulnerabilities and is considered a bad practice. This rule helps identify such cases in your codebase.</p>

<h2>Examples</h2>
<h3>Non-compliant Code</h3>
<pre>
    private static final String username = "myUsername";
    private static final String password = "myPassword";
    </pre>

<h3>Compliant Code</h3>
<pre>
    private static final String someValue = "value"; // Use configuration files or environment variables
    </pre>

<h2>Best Practices</h2>
<ul>
  <li>Do not hardcode sensitive information in your codebase.</li>
  <li>Use configuration files or environment variables to manage sensitive data securely.</li>
</ul>
</body>
</html>

CustomName.json如下

{
  "title": "Custom Sensitive Information Rule - implements Sensor",
  "type": "Bug",
  "status": "ready",
  "tags": [
    "bugs",
    "gandalf",
    "magic"
  ],
  "defaultSeverity": "Critical"
}

4、将CustomNameCheck 加入到MyJavaRulesPlugin

(为什么要把CustomNameCheck 加入到MyJavaRulesPlugin? 我也不知道,只是如果不加入,扫描时无法使用这条规则)

 5、测试代码也要加入,不然打包会报错;

 5、打包

mvn clean install -f .\pom_SQ_9_9_LTS.xml

6、将新生成的jar放到sonarqube\安装目录\extensions\plugins,然后重启项目

 

 接下来如何在sonarqube使用这些规则?请参考:

 SonarQube使用新增的自定义规则,进行maven项目扫描 - yxchun - 博客园 (cnblogs.com)

标签:username,java,自定义,sonarqube,Rule,api,org,sonar,import
From: https://www.cnblogs.com/ychun/p/18367259

相关文章

  • Sonarqube,标识代码中的username/password关键字,分别使用Tree.Kind.STRING_LITERAL 、T
    关于Tree.Kind.STRING_LITERAL、Tree.Kind.IDENTIFIER、Tree.Kind.TEXT_BLOCK等各个区别,请参考:Tree.Kind.STRING_LITERAL、Tree.Kind.IDENTIFIER、Tree.Kind.TEXT_BLOCK区别-yxchun-博客园(cnblogs.com) 1、使用 Tree.Kind.STRING_LITERAL packageorg.sonar.samp......
  • 书生大模型实战营3期 - 进阶岛 - 2 - Lagent 自定义你的 Agent 智能体
    文章目录闯关任务完成结果闯关任务任务描述:Lagent自定义你的Agent智能体任务文档:Lagent自定义你的Agent智能体完成结果使用Lagent自定义一个智能体,并使用LagentWebDemo成功部署与调用,记录复现过程并截图。环境准备/安装:#创建环境condacreate-n......
  • sonarqube添加一条自定义规则,扫描文件中出现的username和password,方法一
    下载源码与使用详情参考:Sonarqube自定义规则,部署SonarSource/sonar-java源码中示例规则:docs/java-custom-rules-example-yxchun-博客园(cnblogs.com)假设你已经有了sonarqube-java源码,并且已经把sonarqube部署到电脑上1、在check里面创建文件 MyTxtBlockCheck.javap......
  • sonarqube如何创建maven项目进行扫描
     1)创建一个maven项目 2)填写名称 3)扫描本地项目 4)生成 5)继续 6)复制命令 7)进行扫描进入到你项目所有的目录,pom.xml那一层级;使用命令,去掉换行符\,-fpom_xxxx.xml写你自己的项目mvncleanverifysonar:sonar-Dsonar.projectKey=mavenProject0819......
  • SonarQube使用新增的自定义规则,进行maven项目扫描
    1、将新加规则添加到QualityProfiles中 2、创建, 写完名称回车  3、暂时将原先的规则禁用掉  点击apply; 499条规则被更改 4、添加我们新增的自定义规则  应用  规则已经添加;将我们创建的规则设置为默认扫描规则 5、进行项目扫描1)创建......
  • Sonarqube 自定义规则,部署SonarSource / sonar-java源码中示例规则:docs/java-custom-r
    自定义规则,可以参考sonar-java/docs/CUSTOM_RULES_101.mdat8.0.0.36314·SonarSource/sonar-java·GitHub1、下载一份sonarqube源码,配置好本地的环境,JDK17和mavendocs/java-custom-rules-example示例项目中会有写好的规则;我们可以先尝试将这些写好的规则添加到Sonarqube......
  • 【TCP/IP】自定义应用层协议,常见端口号
    互联网中,主流的是TCP/IP五层协议5G/4G上网,是有自己的协议栈,要比TCP/IP更复杂(能够把TCP/IP的一部分内容给包含进去了)应用层可以代表我们所编写的应用程序,只要应用程序里面用到了网络通信,就可以认为这个代码就是属于应用层的代码日常开发中最常用到的一层:使用大佬......
  • 027、Vue3+TypeScript基础,使用自定义hook,把功能计算都放到hook中精简代码
    01、在view中创建myhook文件夹,并创建2个文件。usesDog.ts代码如下:import{onMounted,reactive}from"vue";importaxiosfrom"axios";exportdefaultfunction(){//抓取图片letdogList=reactive(['https://images.dog.ceo/breeds/pembro......
  • 自定义类型:结构体
    结构体类型的声明结构的声明structtag{ member-list;}variable-list;例如描述一个学生:structStu{charname[20];//名字intage;//年龄charsex[5];//性别charid[20];//学号};//分号不能丢结构体变量的创建和初始化#include<stdio.h>structStu......
  • Odin Inspector教程 | (四)创建自定义 Drawers(抽屉)
    【OdinInspectorandSerializer最新版免费下载地址】引言在Unity开发过程中,编辑器的用户体验同样重要。OdinInspector作为一个强大的编辑器扩展工具,允许开发者通过创建自定义Drawers来优化和个性化Inspector界面。自定义Drawers可以改变属性的显示方式,增加新的交......