복붙노트

[SPRING] AOP를 사용하여 File, FileReader, FileWriter, FileInputStream 및 FileOutputStream의 생성자를 차단할 수 있습니까?

SPRING

AOP를 사용하여 File, FileReader, FileWriter, FileInputStream 및 FileOutputStream의 생성자를 차단할 수 있습니까?

File, FileReader, FileWriter, FileInputStream 및 FileOutputStream의 생성자를 가로 채고 ".."(경로 통과 공격을 방지하기 위해) 또는 "\ 0"(파일 이름 null 문자 공격을 방지하기 위해)을 포함하는 모든 파일 이름을 차단하려고합니다.

SecurityManager를 사용하여이 동일한 작업을 수행하는 방법에 대한 또 다른 질문이 있지만 아무도 아직 답변하지 않았으므로이 대체 방법이 효과가 있기를 바랬습니다.

이것은 바람둥이에 spring webapp을위한 것입니다.

필자는 SafeFile, SafeFileReader 등의 클래스를 만들고 클래스를 대신 사용하도록 코드를 수정하여 수동으로이 작업을 수행 할 수 있음을 알고 있습니다. 그러나 코드에 해당 객체의 생성자를 사용하는 960 개의 위치가 있으므로 유일한 방법이 아니면 내키지 않는 것이 좋습니다.

해결법

  1. ==============================

    1.프록시 기반 Spring AOP 대신 AspectJ가 필요하다면 Sotirios Delimanolis가 여기에 링크 된 대답은 정확하지만 (나는 직접 작성했다.) JDK 클래스에 대해서는 실행 (* .new (..))을 사용할 수 없다는 점에 유의하기 바란다. 그 이유는 기본적으로 aspect weaving에서 제외되기 때문입니다. JDK 클래스를 만들려면 (실행 joinpoint는 논리적으로 callee 코드에 있음) JDK의 rt.jar를 수정하거나 적어도 JDK 자체 앞에 bootclasspath에 수정 된 JDK 클래스를 넣어야합니다. 이것은 가능하지만 그렇게 사소하지는 않습니다.

    프록시 기반 Spring AOP 대신 AspectJ가 필요하다면 Sotirios Delimanolis가 여기에 링크 된 대답은 정확하지만 (나는 직접 작성했다.) JDK 클래스에 대해서는 실행 (* .new (..))을 사용할 수 없다는 점에 유의하기 바란다. 그 이유는 기본적으로 aspect weaving에서 제외되기 때문입니다. JDK 클래스를 만들려면 (실행 joinpoint는 논리적으로 callee 코드에 있음) JDK의 rt.jar를 수정하거나 적어도 JDK 자체 앞에 bootclasspath에 수정 된 JDK 클래스를 넣어야합니다. 이것은 가능하지만 그렇게 사소하지는 않습니다.

    그러나 caller (*. new (..))를 통해 호출 한 사람이 아니라 호출자 (자신의 코드)를 짜는 간단한 옵션이 있습니다. call ()과 execution ()의 차이점을 확인하십시오. 이것에 의해, 작성된 코드 나 JDK 자체로 작성되지 않은 JDK 클래스에 대한 호출을 가로 챌 수 없다는 것을 의미합니다. 따라서 자신이 제어 할 수없는 코드에 대해서도 100 % 솔루션이 필요하다면 결국 JDK를 짜게 될 것입니다. 아마 당신 자신의 클래스를 보호하기 원한다면 이것은 필요하지 않을 것입니다. :-)

    AspectJ의 열렬한 팬인만큼, 나는 또한 코드와 리펙토링을 확실하게지지한다는 점을 강조하고 싶다. IntelliJ IDEA 나 Eclipse와 같은 괜찮은 IDE라면 당신이 제안한 것과 같은 안전한 래퍼 클래스를 사용하도록 960을 호출하는 것을 매우 간단하게해야합니다. 왜 그렇게 중요한 일을하지 않습니까? IDEA의 구조적 검색 및 교체는 초 단위가 아니라면 몇 분 안에 당신을 대신해줍니다. AOP는 할 수 있지만, 코드의 결함을 패치하는 데는 사용하면 안됩니다. 그래서 제발 리팩토링 가라. 너는 훨씬 더 행복해 질거야.

  2. ==============================

    2.간단한 Spring AOP (프록시 사용)는 생성자 조인 포인트를 지원하지 않습니다.

    간단한 Spring AOP (프록시 사용)는 생성자 조인 포인트를 지원하지 않습니다.

    aspectj와 함께 갈 수 있다면, 그 트릭을해야합니다. 그렇지 않으면 바이트 코드로 직접 연주해야합니다.

  3. from https://stackoverflow.com/questions/24398260/how-can-i-use-aop-to-intercept-the-constructor-of-file-filereader-filewriter by cc-by-sa and MIT license