2012-01-16 2 views
5

우리 팀은 OWASP 가이드 라인을보다 잘 준수하기를 원하며 그 중 하나는 SQL 주입 공격 방지입니다. 이를 용이하게하기 위해 코드베이스에서 java.sql.Statement의 사용법을 자동으로 확인하는 방법을 찾고 있었기 때문에 플래그를 지정하고 PreparedStatement을 사용하도록 변경했습니다.프로젝트에서 java.sql.Statement의 사용을 방지하는 방법을 찾고 있습니다

빌드 프로세스는 Maven을 기반으로하며 프로젝트에 분석을 실행하기위한 Sonar 설정도 있습니다. 특정 임계 값이 충족되면 빌드를 실패하는 일부 규칙이 이미 Sonar에 있습니다. 따라서이 규칙을 구현할 수 있습니다. 가져 오기를 위해 checkstyle regex 규칙을 설정할 수있는 곳을 보았습니다. 그러나 다른 옵션도 있는지 알고 싶었습니다.

개발/빌드 경로상의 모든 위치에서 작동합니다. intelij에 플래그를 지정하는 항목이 있다면, 메이븐 빌드 프로세스의 일부 또는이 옵션을 사용하여 수중 음파 탐지기에서 플래그를 지정할 수 있습니다.

감사합니다.

+0

Prepared Statement와 동일한 주입 공격이 가능하다는 점에 유의하십시오.'connection.prepareStatement ("t1. * from t1. t1.code = '"+ code + "'"))'. 가장 좋은 점은 개발자를 교육하는 것입니다. –

+0

우리는 OWASP 감사를 통해 더 구체적인 항목을 찾을 것입니다. 이 것에 대한 귀하의 성명에 동의하지만, 우리는 검사의 자동화 된 유형의 일부 유형을 원합니다. – jaycyn94

답변

7

나는 Sonar 내에서 creating an architectural constraint을 제안합니다.

이 예는 * java.sql. ** 클래스의 사용을 금지하는 규칙을 보여줍니다.

+0

그게 내가 찾고 있었던 바로 그 것이다. 여하튼 나는 Sonar에있는 그 규칙을 간과했다. 감사! 챔피언처럼 작동합니다. – jaycyn94

1

나는 이것을 사용하지 않았지만 PMD은 이것이 좋은 도구 인 것처럼 보입니다.

+0

SONAR는 PMD, CheckStyle, FindBugs 및 기타 메트릭의 보고서를 집계합니다. SONAR가 사용되는 PMD가 이미 사용되었을 가능성이 있습니다. –

+0

직접 확인하는 PMD 규칙을 보지 못했기 때문에 [CheckStyle] (http://checkstyle.sourceforge.net/)과 동일한 그룹에 속해 있는지 확인하려면 사용자 지정 규칙을 만들어야합니다. 감사! – jaycyn94

+0

그리고 @JBNizet 포인트에 대해서는 이미 코드에서 PMD 룰 세트를 실행하고 있습니다. – jaycyn94

0

클래스 사용을 감지하는 대신 java.sql.Connection 프록시를 사용하여 세대를 감지 할 수 있습니까? 팩토리에서 연결되면 프록시에 래핑됩니다. 사람들이 createStatement() 또는 다른 오프 - 리밋 호출을 사용할 때 메서드 호출, 로그 쿼리 문자열 및/또는 스택 추적에 대한 프록시를 구현할 수 있습니다.

public class ProxyConnection implements Connection { 
    private Connection realConnection; 

    public ProxyConnection(Connection realConnection) { 
     this.realConnection = realConnection; 
    } 

    public Statement createStatement() throws SQLException { 
     // could the offenders 
     createCounter.incrementAndGet(); 
     // log the callers -- expensive so maybe every 100th or every 10 secs 
     logger.info("call to createStatment", new Exception("createStatement")); 
     // maybe just throw 
     if (throwOnBadCall) { 
      throw new SQLException("calls to createStatement aren't allowed")); 
     } 
     return realConnection.createStatement(); 
    } 

당신은 당신이 항상 그들을 셀 수 생산 너무 무거워 만 문제를보고 맛볼 수 시간 동안 점검을 가능하게하는 플래그의 volatile boolean logBadCall 유형이하지 않으려면

. 처음에는 샘플링을 수행하고 80 % 위치를 공격 한 다음 응용 프로그램의 높은 쿼리로드 부분을 처리했을 때만 영구적으로 탐지 할 수 있습니다.

연결을 감쌀 수있는 중앙 위치가 없다면 연결 풀이나 공장을 조금 뒤쪽으로 감쌀 수 있습니다.

희망이 도움이됩니다.

관련 문제