2016-12-15 12 views
0

소나 탐색을 수행 할 때 "변경 될 수있는 멤버를 저장하거나 직접 돌려 보내면 안됩니다."라는 취약점이 발생합니다. 변경 가능한 객체를 복제하거나 수정 불가능한 목록을 반환해야한다고 언급 된 경우에도이 문제를 해결할 수 있습니다. 그러나 객체를 복제 한 다음 나중에 값을 업데이트하려면 복제 된 객체를 반환했기 때문에 원래 객체에 어떻게 액세스 할 수 있습니까? 이것에 대한 의견을 보내 주시면 감사하겠습니다. 사전 그러나음파 탐지기 - 변경 가능한 멤버를 직접 저장하거나 반환하지 말아야합니다.

답변

2

I 개체를 복제하고 경우에 감사 나중에 내가 복제 된 개체

당신은 안에게 반환했기 때문에 나는 원래 개체에 액세스 할 수있는 방법을 다음 값을 업데이트하려면 . 적어도 발신자가 아니야.

여기 사지에 나가서 우리가, 목록에 대해 얘기하고 말할 것이다 :

public class MyClass { 
    private List<String> strings; 

    public List<String> getStrings(){ 
    // returns a copy, so member list is still intact 
    return new ArrayList<String>(strings); 
    } 

    public void addString(String newString) { 
    strings.add(newString); 
    } 

    public void dropString(String oldString) { 
    strings.remove(oldString); 
    } 

    public void replaceString(String oldString, String newString) { 
    dropString(oldString); 
    addString(newString); 
    } 
} 

을 즉, 당신이 소유하는 클래스를 통해 멤버 작업에 대한 액세스를 제어합니다. 누구나 얻을 수 있고 업데이트 할 수있는 공개 멤버가 필요하다면 (권장하지는 않습니다) getter를 삭제하고 멤버를 public으로 만듭니다.

+0

내가 처음 개발자들 사이에서 토론을 한 점이 한 가지 더 있습니다. 호출자가 우리 시스템/응용 프로그램에서 왔고 외부에서 온 것이 아니라면 여전히 가변 객체를 전달하는 것이 취약점이 될 수 있습니까? 호출자가 시스템 내부에서 발생했기 때문에 변경 가능한 객체를 변경하더라도 이것은 시스템에 영향을주지 않습니다. – Swapneel

+0

@Swapneel 나는 보안 전문가는 아니지만 발신자가 항상 "내부"일 것이라고 가정하면 위험하다고 생각한다고 생각합니다. 그러나 보안 요원은 자연과 유방 모두에 의해 편집증을 앓고 있습니다. 귀하의 회신에 감사드립니다. –

+0

apprecal – Swapneel