소나 탐색을 수행 할 때 "변경 될 수있는 멤버를 저장하거나 직접 돌려 보내면 안됩니다."라는 취약점이 발생합니다. 변경 가능한 객체를 복제하거나 수정 불가능한 목록을 반환해야한다고 언급 된 경우에도이 문제를 해결할 수 있습니다. 그러나 객체를 복제 한 다음 나중에 값을 업데이트하려면 복제 된 객체를 반환했기 때문에 원래 객체에 어떻게 액세스 할 수 있습니까? 이것에 대한 의견을 보내 주시면 감사하겠습니다. 사전 그러나음파 탐지기 - 변경 가능한 멤버를 직접 저장하거나 반환하지 말아야합니다.
0
A
답변
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
으로 만듭니다.
내가 처음 개발자들 사이에서 토론을 한 점이 한 가지 더 있습니다. 호출자가 우리 시스템/응용 프로그램에서 왔고 외부에서 온 것이 아니라면 여전히 가변 객체를 전달하는 것이 취약점이 될 수 있습니까? 호출자가 시스템 내부에서 발생했기 때문에 변경 가능한 객체를 변경하더라도 이것은 시스템에 영향을주지 않습니다. – Swapneel
@Swapneel 나는 보안 전문가는 아니지만 발신자가 항상 "내부"일 것이라고 가정하면 위험하다고 생각한다고 생각합니다. 그러나 보안 요원은 자연과 유방 모두에 의해 편집증을 앓고 있습니다. 귀하의 회신에 감사드립니다. –
apprecal – Swapneel