2011-03-22 3 views
2

저는 System.Xml.Linq를 사용하여 MathML을 파싱 할 때 MathML DTD를 사용하고 있습니다. 평범한 MathML 파일은 정상적으로 인식되지만 DTD에 포함 된 MMLEXTRA은 무시되고 오류가 발생합니다. 다음은 내가 사용하고있는 코드입니다.LINQ to XML 무시는 DTD에서 포함합니까?

if (!string.IsNullOrWhiteSpace(mathML)) 
    { 
    try 
    { 
     const string preamble = 
      "<!DOCTYPE mml:math PUBLIC \"-//W3C//DTD MathML 2.0//EN\"\n" + 
      "\"http://www.w3.org/Math/DTD/mathml2/mathml2.dtd\" [\n" + 
      "<!ENTITY % MATHML.prefixed \"INCLUDE\">\n" + 
      "<!ENTITY % MATHML.prefix \"mml\"> \n" + 
     "]>"; 
     var parsed = Parser.Parse(preamble + Environment.NewLine + mathML); 
     textEditor.Text = printed; 
     lblStatus.Caption = "MathML successfully translated."; 
    } 
    catch (Exception e) 
    { 
     lblStatus.Caption = "Cannot translate text. " + e.Message; 
    } 
    } 

구문 분석기는 단순히 XDocument.Load()입니다. 어떤 도움을 주셔서 감사합니다! DTD의에서

+0

에서 무엇입니까? –

+0

@Kirk'Parser'는 기본적으로'XDocument.Load'를 수행하는 구성 요소 일뿐입니다. 이 호출은 모든 MathML 참조를 직접 해결하지만 가정하지는 않습니다. –

답변

6

here에서 엔티티는 본질적으로 안전하지 않습니다. DTD가 포함 된 악성 XML 문서로 인해 파서가 메모리 및 CPU 시간을 사용하여 서비스 거부 공격을 일으킬 수 있습니다. 따라서 LINQ to XML에서 DTD 처리는 기본적으로 해제되어 있습니다. 신뢰할 수없는 출처의 DTD를 허용해서는 안됩니다.

그러나 활성화하려면 XDocumentType class을 사용해야합니다.

가능한 솔루션의 몇 가지 :

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ProhibitDtd = false; 

XmlReader reader = XmlReader.Create(Server.MapPath("filename"), settings); 

XDocument doc = XDocument.Load(reader); 

아니면 :

XDocument xDocument = new XDocument(new XDocumentType("Books",null,"Books.dtd", null),new XElement("Book")); 

모든 정보는`Parser` 무엇입니까 같은 source

+0

굉장! 그것은 나를 위해 그것을 완전히한다. 휴! 50 포인트를 소비했지만 제품은 안전합니다 :) 감사합니다! –