2009-11-14 6 views
15

모든 코드에 대해 findbugs를 실행하고 가장 중요한 항목 만 처리합니다. 나는 마침내 최고의 물건을 해결했고, 지금 세부를보고있다.MALICIOUS_CODE EI_EXPOSE_REP 보통

public class User implements Serializable 
{ 
    protected Date birthDate; 

    public Date getBirthDate() 
    {return(birthDate);} 

    public void setBirthDate(final Date birthDate) 
    {this.birthDate = birthDate;} 
} 

이 클래스는 불완전하다, 그래서이 serialVersionUID 및 다른 표준 물건 누락에 대해 말해 하프하지 않습니다, 나는 birthDate 보안 구멍이 단지 걱정 : 나는 간단한 엔티티가 사용자를 말한다.

이제 findbugs 보고서에 따르면 변경 가능한 개체에 대한 참조가 반환되므로 잠재적 인 보안 위험이 있습니다. 실제로는 얼마나 중요합니까?

http://findbugs.sourceforge.net/bugDescriptions.html#EI_EXPOSE_REP

나는 아직도 정말 문제가이 경우에 여기에 무엇을 볼 수 없습니다 가정합니다. long을 전달하고 그 날짜를 설정해야합니까?

월터

답변

31

여기 키가 생각하는 경우 :

인스턴스가 신뢰할 수없는 코드에 의해 액세스 및 변경 가능한 객체에 체크되지 않은 변경 사항이 보안이나 다른 중요한 특성을 손상 할 경우를 다른 것을해야 할 것입니다.

Date date = user.getBirthDate(); 
date.setMonth(1); // mutated! 

을 그래서 당신에게 누군가가 쓸 수 있기 때문에 당신은 불변의 객체를 원 경우 즉 그래서

, , 당신의 코드가 잘못되었을 수 (즉, 당신은 setBirthdate() 방법이 없었다) 아마도 대신 다음 원하는 것 :

public Date getBirthDate() 
{return new Date(birthDate.getTime());} // essentially a clone 
+0

나는 두 가지 의견에 모두 동의한다. 내가하는 일에 대해 나는 이것에 대해 걱정할 필요가 없다. 이것은 좋은 지적을 제기하지만, getters는 항상 단순히 반환 (속성)되지 않을 수도 있습니다; 전에 그 보안 측면을 놓쳤습니다. 귀하의 의견에 감사드립니다 매트와 로버트. –

2

글쎄, 나는 모두가 달려 있음을 말할 것입니다. 불변의 객체를 돌려주는 다른 비보안의 이유가 있습니다. 왜냐하면, 객체가 잘못 사용되고 있으면, 코드 내에 발견하기 어려운 버그가 생길 가능성이 있기 때문입니다.

신뢰할 수없는 코드 및/또는 데이터로 클래스에 액세스 할 예정입니까? 그렇다면 입력의 유효성 확인과 관련하여 애플리케이션의 책임 소재가 무엇인지 명확하게 파악해야합니다.

또한 애플리케이션의 특성은 무엇입니까? 예를 들어 외부 접근 가능한 네트워크 서비스라면 입력은 잠재적으로 악의적 인 것으로 간주되어야합니다. 그러나 응용 프로그램이 신뢰할 수있는 소스에서 입력을 가져 오는 권한이 없으므로 로컬로 실행하는 경우 걱정할 필요가 없습니다.

5

그래, 정말로 '보안'문제는 아닙니다 ... 내 말은, 어떤 공격자가 귀하의 개체에 악의적 인 코드를 쓰고있는 것입니까? 진짜 문제는 우연히 getBirthDate에 전화하여 결과를 수정하여 출장 할 가능성이 높다는 것입니다.

이러한 이유로 값 유형으로 사용하는 경우 복귀를 위해 Date과 같은 변경 가능한 객체를 복제하는 것이 일반적입니다.

(Java의 Date은 변경 가능해서는 안되지만, 지금은별로 할 수 없다고 주장 할 수도 있습니다.속성을 설정하는 경우)

+2

@bobince - "... 내 말은, 어떤 공격자가 당신의 객체에 악의적 인 코드를 쓰려고 할 것인가?" Findbugs는 코드가 실행되는 환경에 대해 아무것도 모릅니다. 그리고 너도 마찬가지야! 이 특정 "버그"가 심각한 보안 문제가 될 수있는 상황이 있습니다. –

+1

물론, * 모든 * 버그가 보안 문제가 될 수 있습니다. 나는 많은 자바 코더들이 코드베이스의 다른 클래스에 대해 편집증 적으로 그렇게하는 것이 다소 이상하다고 생각한다. 실제 프로젝트의 99 %가 내부 보안을 갖고 있지 않다는 것을 감안할 때, 경계는 실제로 이런 종류의 수밀성을 필요로합니다. – bobince

2

매트 Solnit의 좋은 답변에 추가, 나는 같은 문제에 직면했습니다, 그래서 같은했다 :

public void setDataEmissaoNota (Date dataEmissaoNota) 
{ 
    this.dataEmissaoNota = new Date(dataEmissaoNota.getTime()); 
} 

일의 미세!

관련 문제