기본 색소폰 파서를 사용할 때 제작 된 XML에 의해 jaxb unmarshal 남용이 있습니까?

StackOverflow https://stackoverflow.com/questions/1638528

  •  08-07-2019
  •  | 
  •  

문제

그래서 현재 프로젝트에서 나는 Sun 's JRE (Xerces라고 생각하는)의 기본 Java Parser와 함께 JaxB RI를 사용하여 임의의 임의의 XML에 이르기까지 사용합니다.

먼저 XJC를 사용하여 다음 양식의 XSD를 컴파일합니다.

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema attributeFormDefault="unqualified" 
elementFormDefault="qualified" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="foobar">
...
</xs:element> 
</xs:schema>

"좋은 경우"에서 모든 것이 설계된대로 작동합니다. 즉,이 스키마를 준수하는 XML을 통과 한 다음 JAXB는 객체 트리로 올바르게 깎지 않습니다.

문제는 외부 DTD 참조로 XML을 통과했을 때 발생합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foobar SYSTEM "http://blahblahblah/foobar.dtd">
<foobar></foobar>

이와 같은 것을 모색 할 때 Sax Parser는 원격 엔티티를로드하려고 시도합니다 (”http : //somehost/foobar.dtd")이 스 니펫이 XJC로 이전에 편집 한 스키마를 분명히 준수하지 않는다는 사실에도 불구하고.

이 동작을 우회하기 위해, XSD I에 따르면, XSD I에 따라) 원격 엔티티의 로딩이 필요하지 않다는 것을 알고 있기 때문에 모든 원격 엔티티의 로딩을 단락시키는 사용자 정의 엔터티 제고버를 정의해야합니다. 그래서 다음과 같은 일을하는 대신 :

MyClass foo = (MyClass) myJAXBContext.createUnmarshaller().unmarshal(myReader);

나는 이것을해야한다 :

XMLReader myXMLReader = mySAXParser.getXMLReader();
myXMLReader.setEntityResolver(myCustomEntityResolver);
SAXSource mySAXSource = new SAXSource(myXMLReader, new InputSource(myReader));
MyClass foo = (MyClass) myJAXBContext.createUnmarshaller().unmarshal(mySAXSource);

그래서 나의 궁극적 인 질문은 다음과 같습니다.

JAXB와마다 할 수 없을 때, 기본 색소폰 파서에 의해 원격 엔터티의 로딩이 자동으로 해당 XML이 원격 엔터티를로드하지 않고 유효하지 않은 것으로 인식 될 때 단락?

또한 이것이 보안 문제처럼 보이지 않습니까? JAX-WS가 후드 아래에서 JAXB에 의존한다는 점을 감안할 때, 특별히 제작 된 XML을 JAX-WS 기반 웹 서비스에 전달하고 WS 호스트가 임의의 URL을로드하는 것 같습니다.

나는 이것에 대해 상대적으로 초보자이므로 아마 내가 놓친 것이있을 것입니다. 그렇다면 알려주세요!

도움이 되었습니까?

해결책

잘 만들어진 질문, 대답이 필요합니다 :)

주목할만한 것들 :

  1. JAXB 런타임은 XML 스키마에 의존하지 않습니다. 색소폰 파서를 사용하여 객체 모델에 바인딩하는 데 사용하는 색소폰 이벤트 스트림을 생성합니다. 이 객체 모델은 XJC를 사용하여 스키마에서 손으로 작성하거나 생성 될 수 있지만 바인딩과 런타임은 서로 매우 다릅니다. 그래서 양호한 XML 입력이 런타임시 스키마에 부합한다는 것을 알 수 있지만 JAXB는 그렇지 않습니다.
  2. 원격 DTD 참조를로드하도록 런타임을 강제하는 것은 보안 구멍이 아닙니다. 끝에 실제 DTD가 있다면 최악의 경우는 검증되지 않는다는 것입니다. 실제 DTD가 아니라면 무시됩니다.
  3. DTD는 쓸모없는 것으로 간주되므로 높은 수준의 JAXB API에서 직접 지원하지 않습니다. 필요한 경우 EntityResolver, 당신은 이미 한 SAX API를 파헤쳐 야합니다.
  4. 클래스 모델이 XML 스키마에서 생성 된 경우 런타임에 유효성을 사용하여 SchemaFactory 그리고 Unmarshaller.setSchema(). 이렇게하면 Xerces가 JAXB로 전달되기 전에 스키마에 대한 색소폰 이벤트를 검증하도록 지시합니다. 이것은 DTD를 가져 오는 것을 멈추지 않지만 데이터가 양호하다는 것을 알고있는 안전 층을 추가합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top