>source

시스템 환경 변수에서 데이터를 가져 오는 방법이 있습니다.이 방법은 의도 한대로 작동하지만 sonarQube는 "환경 변수가 여기서 안전하게 사용되는지 확인하십시오"라고 말합니다. 이 문제를 해결하기위한 대안을 찾으려고했지만 해결책을 찾을 수 없습니다. 방법은 다음과 같습니다.

이 보안 문제를 어떻게 처리 할 수 ​​있습니까? 환경 변수에서 값을 가져 오는 것 외에는 사용할 수 없습니다.

public Map<String, Object> getConfigurations() {
    Map<String, Object> result = new HashMap<>();
    HttpResponse response = null;
    try {
         String xVaultToken = System.getenv("XVaultToken");
         String cityAppConfig = System.getenv("CityApp_Config");
        @SuppressWarnings("deprecation")
        HttpClient client = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier())
                .setSslcontext(
                        new SSLContextBuilder().loadTrustMaterial(null, (x509Certificates, s) -> true).build())
                .build();
        Map<String, Object> headerDatas = new HashMap<>();
        headerDatas.put("Content-Type", "application/json");
        headerDatas.put("X-Vault-Token", xVaultToken);
        HttpGet get = new HttpGet(cityAppConfig);
        Set<String> keys = headerDatas.keySet();
        for (String key : keys) {
            get.setHeader(key, headerDatas.get(key).toString());
        }
        response = client.execute(get);
        try(BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()))){
            String responseData = rd.readLine();
            result.put(Constants.RESPONSE, responseData);
        }
        int statusCode = response.getStatusLine().getStatusCode();
        result.put(Constants.STATUS, statusCode);
    } catch (Exception e) {
        logger.info("error is local settings getConfigurations" + e);
    }
    return result;
}

}


  • 답변 # 1

    면책 조항 !!!

    우선, 내 의견에서 언급했듯이 누군가가 ENV- 변수를 읽도록 요구하지만 SonarQube 경고를 위양성으로 표시 할 수 없다고 말하는 경우 : 그들이 살아야한다고 (정중하게) 말하십시오 SonarQube 경고와 함께.

    그러나 이것이 어떤 이유로 든 옵션이 아닌 경우 SonarQube에서 경고를 트리거하지 않을 수있는 두 가지 방법을 보여 드리겠습니다. 이는 호출하는 것보다 훨씬 덜 장황합니다. cmd.exe 그 목적을 위해.

    예 1 다음을 통해 함수 호출 java.util.function.Function
    private static String getenv(String variable) {
        return ((Function<String, String>) System::getenv).apply(variable);
    }
    
    
    예 2 리플렉션을 통해 함수 호출
       private static String getenv(String variable) {
            try {
                return (String) System.class.getMethod("getenv", String.class).invoke(null, variable);
            } catch (ReflectiveOperationException e) {
                throw new RuntimeException(e);
            }
        }
    
    

  • 답변 # 2

    이러한 모든 "보안 핫스팟"경고는 "TODO"알림 일 뿐이며 다음 세 단계로 해결해야합니다.

    값이 실제로 안전하게 사용되는지 확인하십시오.

    이 특별한 경우 : 외부 제공 URL에 GET 요청을 호출 한 다음 응답의 값을 사용합니다. 누군가가 비밀 수단으로 환경 변수 값을 변경하고 자신의 웹 서버를 가리키면 어떻게됩니까? 응답이 민감한 항목에 사용됩니까? 때로는 URL이 호출되었다는 사실조차도 악의적 인 목적 (추적)으로 사용될 수 있습니다. 기타 등등

    더하다 @SuppressWarnings({"squid:S5304"}) 주석에 적절한 설명과 함께.

    모든 것이 제대로 검토되었는지 확인하십시오.포함1 단계의 추론을 기억하십시오. 두 개의 머리가 하나보다 낫습니다 (특히 보안에서).

  • 답변 # 3

    낮은 수준의 문제는 다음을 사용하여 억제 할 수 있습니다. @SuppressWarnings({"squid:S5304"}) . 이 문장을 수업 수준에 추가하십시오.

  • 답변 # 4

    많은 검색 후 환경 변수를 사용하여 중요한 정보를 저장하는 것은 좋지 않은 생각이지만 나와 같은 다른 옵션이 없다면 해결 방법은 다음과 같습니다.

    System.getenv ( "XVaultToken")을 사용하는 대신 다음과 같은 방법을 사용하십시오.

    private String cmdUrl = "cmd.exe /c echo %wfManagement_Config%";
    String cityAppConfig =  getEnvironmentVariable(cmdUrl)
    private String getEnvironmentVariable(String cmd){
        String environmentVar = "";
        Process p;
        try {
            p = Runtime.getRuntime().exec(cmd);
            p.waitFor(); 
            BufferedReader reader=new BufferedReader(new InputStreamReader(
             p.getInputStream())); 
            String line; 
            while((line = reader.readLine()) != null) { 
                environmentVar = line;
            }
            return environmentVar;
        } catch (Exception e) {
            logger.info("Exception-->"+e);
        }
        return environmentVar;
        
    }
    
    

    이 메서드는 명령을 실행하고 환경 변수를 가져옵니다. 몇 가지 이유로 sonarQube는이를 무시하고 보안 문제를 제공하지 않습니다.

관련 자료

  • 이전 amazon web services - Ubuntu 200LTS의 AWS CodeDeploy-Agenten, Ruby 오류
  • 다음 python - Pandas 데이터 프레임에서 groupby를 사용하여 고유 값 계산