jaxb unmarshal abusable وضعت من قبل xml عند استخدام الافتراضي ساكس محلل?

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

  •  08-07-2019
  •  | 
  •  

سؤال

حتى في بلدي المشروع الحالي يمكنني استخدام JAXB ري مع جافا الافتراضية محلل من الشمس JRE (التي أعتقد هو Xerces) إلى unmarshal التعسفي 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 بشكل صحيح unmarshals إلى كائن شجرة.

المشكلة تأتي عندما أكون مرت XML مع خارجي DTD المراجع على سبيل المثال

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

عند unmarshalling شيئا من هذا القبيل, ساكس محلل محاولات لتحميل البعيد الكيان ("http://somehost/foobar.dtd") على الرغم من أن هذا مقتطف بوضوح لا يتوافق مع المخطط جمعت في وقت سابق مع XJC.

من أجل الالتفاف على هذا السلوك منذ وأنا أعلم أن أي conformant XML (وفقا XSD جمعت) لن تحتاج التحميل من بعيد الكيان ، يجب أن تحدد مخصص EntityResolver أن دوائر قصيرة التحميل من جميع الكيانات النائية.لذا بدلا من القيام بشيء من هذا القبيل:

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);

لذا السؤال الجوهري هو:

عندما unmarshalling مع JAXB يجب تحميل عن بعد الكيانات الأساسية ساكس محلل تكون تلقائيا دارة قصيرة عندما XML في السؤال يمكن أن يكون المعترف بها باطل بدون تحميل تلك البعيد الكيانات ؟

أيضا, لا يبدو هذا مثل قضية أمنية ؟ بالنظر إلى أن جاكس-WS يعتمد على JAXB تحت غطاء محرك السيارة, يبدو أنني يمكن أن تمر وضعت خصيصا XML إلى أي جاكس-WS القائمة على خدمة ويب وتسبب WS المضيف إلى تحميل أي التعسفي URL.

أنا قريب مبتدئ في هذا ، لذلك ربما هناك شيء أنا في عداد المفقودين.واسمحوا لي أن أعرف إذا كان الأمر كذلك!

هل كانت مفيدة؟

المحلول

وكذلك وضعت سؤال يستحق الإجابة :)

بعض الأشياء أن نلاحظ:

  1. على JAXB وقت لا تعتمد على مخطط XML.ويستخدم ساكس محلل لتوليد تيار ساكس الأحداث التي يستخدم لربط إلى نموذج كائن.هذا نموذج كائن يمكن أن تكون مكتوبة بخط اليد ، أو يمكن أن تتولد من المخطط باستخدام XJC, ولكن ملزم وقت متميزة جدا من بعضها البعض.لذلك لك قد تعرف هذا جيدا XML الإدخال يتوافق مع المخطط في وقت التشغيل ، ولكن JAXB لا.
  2. مما اضطر وقت تحميل عن بعد باب إلى باب الإشارة لا يشكل ثغرة أمنية.إذا كان هناك حقيقية باب إلى باب في نهاية الأمر أسوأ الأحوال هو أنه لا صحة.إذا ليس DTD, ثم أنها سوف تكون تجاهلها.
  3. DTD يعتبر عفا عليها الزمن ، لذلك ليس هناك دعم مباشر في ارتفاع مستوى JAXB API.إذا كنت بحاجة إلى EntityResolver, تحتاج إلى حفر في ساكس API التي كنت قد فعلت بالفعل.
  4. إذا كان لديك نموذج فئة تم إنشاؤها من مخطط XML, ثم عليك أن تنظر في صحة ضدها في وقت التشغيل باستخدام SchemaFactory و Unmarshaller.setSchema().هذا سوف يكلف Xerces للتحقق من ساكس الأحداث ضد المخطط قبل أن يتم تمريرها إلى JAXB.هذا لن يوقف DTD يجري المنال ، لكنه يضيف طبقة من سلامة عليك أن تعرف البيانات جيدة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top