May expose internal representation by incorporating reference to mutable object

2557 단어 Security
FindBugs 분석 버그
May expose internal representation by incorporating reference to mutable object
This code stores a reference to an externally mutable object into the internal representation of the object.  If instances are accessed by untrusted code, and unchecked changes to the mutable object would compromise security or other important properties, you will need to do something different. Storing a copy of the object is better approach in many situations.
 
대략적인 의미:
 
이 코드는 외부의 가변 대상의 내재적인 표현 대상을 인용하는 것을 저장한다.
만약 상황에서 신뢰할 수 없는 코드를 사용할 수 있다면, 변경되지 않은 가변 대상과 안전이나 다른 중요한 성질을 약화시킬 수 있다면, 당신은 다른 일을 해야 한다.
많은 경우 객체를 복제하는 데 더 좋은 방법이 있습니다.
 
package test; 

import java.util.Date; 

public class Demo { 

 /**
  * @param args
  */
 public static void main(String[] args) {
        Test test= new Test(); 
        Date now = new Date();   
        test.setCreateDate(now);
        System.out.println(test.getCreateDate());
        now.setYear(210);//    !
        System.out.println(test.getCreateDate()); 

     }
} 

  

package test; 

import java.util.Date; 

    public class Test { 

    private Date createDate ;    

    public void setCreateDate(Date createDate) { 

//      Findbugs     
        this.createDate = createDate; 
//      this.createDate = createDate==null?null:(Date)createDate.clone(); 
//              null,         null,  (Date)      
    } 

    public Date getCreateDate() { 
        return createDate; 
    } 

} 

 
 
하나의 대상(now)을 수정하면 다른 대상(test)의 수정을 일으킬 수 있습니다. 즉, 테스트=getCreateDate().할당이 끝난 후 now의 값을 수정해야 한다면 문제가 있습니다!
 
주석 부분으로 수정할 수 있으며,this로 직접 되돌아오지 않습니다.테스트가 아니라this로 되돌아옵니다.테스트의 복사입니다.
 
직접 운행하고, 풀린 주석을 풀고, 다시 시험해 보고, 결과를 보자.
 
사람을 깊이 생각하게 하는구나!
 
확장:
Java는 객체 자체가 아닌 값에 따라 참조를 복사하고 전달합니다.
1. 기본 유형은 매개 변수로 전달할 때 전달 값의 복사입니다. 당신이 이 복사를 어떻게 바꾸든지 원값은 변하지 않습니다.자바에서 대상을 매개 변수로 전달할 때, 대상이 메모리에 있는 주소를 복사하여 매개 변수에 전달한 것으로, 값을 부여하는 것과 같다.원 인용이 원 대상을 가리킬 때 방법은 원 대상의 값을 바꿀 수 있다.인용이 복사본일 경우 교환 함수가 효력을 상실합니다.인용의 사본이 원래 인용이 아니라 교환되었다.방법이 호출된 후 교환되지 않은 원인용을 얻었다.함수 체외에서 원 인용을 교환하여 성공적인 교환을 실현할 수 있다.
 
요약하자면 JAVA에서 방법에 간단한 유형을 전달할 때 전달하는 것은 하나의 값(부치 전달)이다.전달된 대상이 대상일 때 인용에 따라 전달한다(메모리에 있는 대상 주소를 이 대상에게 부여하면 내 이해 역시 직접 값을 다른 대상 모델과 같은 대상에게 전달하는 것이다).
 

좋은 웹페이지 즐겨찾기