자바 보안 인 코딩 안내: 표현 식 규칙

글 목록
  • 안내
  • 표현 식 의 반환 값 주의
  • NullPointer Exception
  • 주의
  • 배열 이 같은 판단
  • 기초 유형의 포장 류 간 의 비교
  • 집합 중 유형 이 일치 하지 않 음
  • Asset 의 부작용
  • 간단 한 소개
    자바 작성 과정 에서 우 리 는 다양한 표현 식 을 사용 할 것 입 니 다. 표현 식 을 사용 하 는 과정 에서 어떤 안전 문제 가 우리 가 주의해 야 합 니까?같이 보 자.
    표현 식 의 반환 값 에 주의 하 십시오.
    우 리 는 JDK 라 이브 러 리 를 사용 할 때 JDK 의 방법의 의미 와 반환 값 을 진지 하 게 읽 어야 한다.
    일부 반환 값 은 이 작업 이 성 공 했 는 지, 어떤 반환 값 은 방법 작업 의 결과 일 수 있 습 니 다.우 리 는 두 가지 흔히 볼 수 있 는 예 를 본다.
        public void deleteFileWrong(){
         
            File file= new File("/tmp/www.flydean.com.txt");
            file.delete();
            System.out.println("File delete success!");
        }
    
        public void deleteFileRight(){
         
            File file= new File("/tmp/www.flydean.com.txt");
            if(file.delete()){
         
                System.out.println("File delete success!");
            }
        }
    

    먼저 파일 삭제 의 예 를 보 세 요. delete 방법 은 반환 값 이 있 기 때문에 delete 방법 을 호출 한 후에 반환 값 을 판단 하여 삭제 에 성 공 했 는 지 확인 해 야 합 니 다.
    일반적인 String 에서 문자 가 바 뀌 는 예 를 다시 봅 니 다:
        public void stringReplaceWrong(){
         
            String url="www.flydean.com";
            url.replace("www","WWW");
            System.out.println("replaced url..."+url);
        }
        public void stringReplaceRight(){
         
            String url="www.flydean.com";
            url=url.replace("www","WWW");
            System.out.println("replaced url..."+url);
        }
    

    String 은 가 변 적 이지 않 기 때문에 replace 방법 은 교 체 된 String 을 되 돌려 줍 니 다. 그러나 원래 String 은 변 하지 않 기 때문에 반환 값 을 다시 할당 해 야 합 니 다.
    NullPointerException 을 피하 세 요.
    NullPointer Exception 은 가장 흔히 볼 수 있 는 운행 시 이상 일 것 입 니 다.어떻게 이 이상 을 피 합 니까?
    우리 가 해 야 할 일 은 object 를 호출 하 는 방법 일 때 이 object 가 비어 있 는 지 아 닌 지 를 판단 하 는 것 이다.
    JDK 8 이후 우 리 는 Stream 작업 을 도입 했다.
        public void streamWrong(Collection<Object> collection){
         
            collection.stream().filter(obj->obj.equals("www.flydean.com"));
        }
    

    Stream 작업 을 하 는 과정 에서 stream 의 요소 가 비어 있 는 지 주의해 야 합 니 다.
    때때로 우 리 는 이미 판단 이 비 었 다 고 생각 할 수 있 지만 조건 판단 이 정확 하지 않 아 미 지 의 이상 을 초래 할 수 있다. 다음 과 같은 예 를 보 자.
        public int countWrong(Collection<Object> collection, Object object){
         
            int count=0;
            if(collection ==null){
         
                return count;
            }
            for(Object element: collection){
         
                if((element ==null && object== null)
                    || element.equals(object)){
         
                    count++;
                }
            }
            return count;
        }
    

    이 예 는 collection 에 얼마나 많은 요소 가 object 와 같 는 지 찾 는 것 입 니 다. 둘 다 비어 있 으 면 똑 같이 기록 합 니 다.
    그러나 위의 예 에 구멍 이 있 습 니 다. element = null, object 를 고려 하지 않 았 습 니 다! =null 의 경우 NullPointer Exception 이 생 성 됩 니 다.
    우 리 는 이렇게 수정 해 야 한다.
       public int countRight(Collection<Object> collection, Object object){
         
            int count=0;
            if(collection ==null){
         
                return count;
            }
            for(Object element: collection){
         
                if((element ==null && object== null)
                        || (element !=null && element.equals(object))){
         
                    count++;
                }
            }
            return count;
        }
    

    배열 이 같은 판단.
    만약 우리 가 두 배열 이 같은 지 비교 해 야 한다 면, 사실은 우리 가 비교 하고 싶 은 것 은 두 배열 의 요소 가 같은 지 하 는 것 이다.
    우 리 는 배열 이 특수 한 Object 라 는 것 을 알 고 있 습 니 다. 그러면 배열 대상 도 equals 방법 이 있 습 니 다. 다음 의 예 를 고려 하 십시오.
        public boolean compareWrong(){
         
            int[] array1 = new int[10];
            int[] array2 = new int[10];
            return array1.equals(array2);
        }
    

    결 과 는 false 입 니 다. 배열 은 Object 에서 정의 하 는 equals 방법 을 직접 사 용 했 기 때문에 이 방법의 정 의 를 보 겠 습 니 다.
        public boolean equals(Object obj) {
         
            return (this == obj);
        }
    

    이 방법 은 두 주소 가 같은 지 비교 해 볼 수 있다.그래서 우 리 는 false 결과 에 이 르 렀 다.
    사실, 우 리 는 Arrays. equals 도구 류 의 방법 으로 두 배열 의 비 교 를 할 수 있 습 니 다.
        public boolean compareRight(){
         
            int[] array1 = new int[10];
            int[] array2 = new int[10];
            return Arrays.equals(array1, array2);
        }
    

    기본 유형의 패 키 징 클래스 간 비교
    자바 에서 우 리 는 boolean, byte, char, short, int 와 같은 기본 적 인 유형 이 있다 는 것 을 알 고 있 습 니 다.
    우 리 는 기본 유형의 값 을 패키지 유형 에 직접 할당 할 수 있 으 며, 패키지 유형 은 스스로 전환 할 수 있 습 니 다.
    아래 의 예 를 고려 하 다.
            Boolean boolA=true;
            Boolean boolB=true;
            System.out.println(boolA==boolB);
    

    결 과 는 얼마 일 까요?
    답 은 트 루.왜 두 개의 서로 다른 대상 의 비 교 는 true 일 까요?
    이 질문 에 대답 하기 전에 문자열 의 비 교 를 살 펴 보 자.
            String stringA="www.flydean.com";
            String stringB="www.flydean.com";
            System.out.println(stringA==stringB);
    

    이것 은 우리 모두 가 알 고 있 을 것 입 니 다. String 은 문자열 상수 탱크 가 있 기 때문에 문자열 상수 에서 직접 구 축 된 String 대상 은 같은 대상 입 니 다.
    마찬가지 로 불 리 언 과 바 이 트 는 기본 클래스 에서 직접 구축 하면 같은 대상 이다.
    Character 의 경우 값 의 범위 가 \ u0000 to \ u007 f 이면 같은 대상 에 속 하고 이 범 위 를 넘 으 면 다른 대상 이다.
    Integer 와 Short 의 경우 값 의 범위 가 - 128 and 127 이면 같은 대상 에 속 하고 이 범 위 를 넘 으 면 다른 대상 이다.
    다음 의 예 를 다시 고려 하 다.
    Boolean boolA=true;
    Boolean boolC=new Boolean(true);
    System.out.println(boolA==boolC);
    

    출력 결 과 는 false 입 니 다. boolc 는 new 키 워드 를 사용 하여 새로운 대상 을 만 들 었 습 니 다.
    집합 중 형식 이 일치 하지 않 습 니 다.
    현재 자바 집합 은 지정 한 형식 을 통 해 특정 유형의 대상 만 저장 할 수 있 습 니 다.다음 의 예 를 고려 해 보 자.
        public void typeMismatch(){
         
            HashSet<Short> shortSet= new HashSet<>();
            for(int i=0;i<10;i++){
         
                shortSet.add((short)i);
                shortSet.remove(i);
            }
            System.out.println(shortSet.size());
        }
    

    위의 코드 는 우리 가 Short 의 집합 을 정의 한 후에 0 - 9 를 추가 한 다음 에 우 리 는 reove 방법 으로 i 를 집합 에서 삭제 했다.
    그러나 마지막 출력 결 과 는 10 으로 삭제 에 성공 하지 않 았 음 을 나타 낸다.왜 일 까요?
    HashSet 의 remove 방법 보기:
        public boolean remove(Object o) {
         
            return map.remove(o)==PRESENT;
        }
    

    reove 방법의 인 자 는 Object 입 니 다. 우리 가 들 어 온 i 는 int 형식 으로 short 와 일치 하지 않 아 삭제 에 실 패 했 습 니 다.
    우 리 는 이렇게 수정 해 야 한다.
        public void typeMatch(){
         
            HashSet<Short> shortSet= new HashSet<>();
            for(int i=0;i<10;i++){
         
                shortSet.add((short)i);
                shortSet.remove((short)i);
            }
            System.out.println(shortSet.size());
        }
    

    Asset 의 부작용
    저 희 는 Asset 문 구 를 사용 하여 코드 에서 디 버 깅 을 하고 사용 하 는 과정 에서 Asset 문 구 는 시스템 의 업무 논리 에 부작용 을 일 으 키 지 않도록 주의해 야 합 니 다. 즉, Asset 문 구 를 실행 하지 않 더 라 도 코드 의 업무 논 리 를 수정 하지 않 습 니 다.
    아래 의 예 를 보십시오.
        public void assetWrong(ArrayList<Integer> list){
         
            assert  list.remove(0)>0;
        }
    

    위의 코드 는 list 에서 첫 번 째 요 소 를 삭제 하고 삭 제 된 요소 가 0 보다 큰 지 판단 합 니 다.
    위의 코드 가 assert 문 구 를 실행 하지 않 으 면 업무 논리 도 실행 되 지 않 기 때문에 다음 과 같이 수정 해 야 합 니 다.
        public void assetRight(ArrayList<Integer> list){
         
            int result=list.remove(0);
            assert  result>0;
        }
    

    본문의 예:
    learn-java-base-9-to-20/tree/master/security
    본문 은 이미 수록 되 었 다.http://www.flydean.com/java-security-code-line-expresion/
    가장 통속 적 인 해석, 가장 깊 은 건어물, 가장 간결 한 튜 토리 얼, 당신 이 모 르 는 작은 기술 들 이 당신 을 기다 리 고 있 습 니 다!
    나의 공식 번호 에 관심 을 가 져 주 십시오. "프로그램 그런 일 들", 기술 을 알 고 당신 을 더 잘 알 고 있 습 니 다!

    좋은 웹페이지 즐겨찾기