@@ -6,6 +6,7 @@ namespace FSharp.Data.Runtime.BaseTypes
66
77open System.ComponentModel
88open System.IO
9+ open System.Xml
910open System.Xml .Linq
1011
1112#nowarn " 10001"
@@ -56,7 +57,14 @@ type XmlElement =
5657 IsError = false ) >]
5758 static member Create ( reader : TextReader ) =
5859 use reader = reader
59- let element = XDocument.Load( reader, LoadOptions.PreserveWhitespace) .Root
60+ // Secure XML parsing: disable DTD processing and external entities to prevent XXE attacks
61+ let xmlReaderSettings =
62+ new XmlReaderSettings(
63+ DtdProcessing = DtdProcessing.Prohibit,
64+ XmlResolver = null ,
65+ MaxCharactersFromEntities = 1024 L * 1024 L) // 1MB limit
66+ use xmlReader = XmlReader.Create( reader, xmlReaderSettings)
67+ let element = XDocument.Load( xmlReader, LoadOptions.PreserveWhitespace) .Root
6068 { XElement = element }
6169
6270 /// <exclude />
@@ -69,12 +77,23 @@ type XmlElement =
6977 use reader = reader
7078 let text = reader.ReadToEnd()
7179
80+ // Secure XML parsing: disable DTD processing and external entities to prevent XXE attacks
81+ let xmlReaderSettings =
82+ new XmlReaderSettings(
83+ DtdProcessing = DtdProcessing.Prohibit,
84+ XmlResolver = null ,
85+ MaxCharactersFromEntities = 1024 L * 1024 L) // 1MB limit
86+
7287 try
73- XDocument.Parse( text, LoadOptions.PreserveWhitespace) .Root.Elements()
88+ use stringReader = new StringReader( text)
89+ use xmlReader = XmlReader.Create( stringReader, xmlReaderSettings)
90+ XDocument.Load( xmlReader, LoadOptions.PreserveWhitespace) .Root.Elements()
7491 |> Seq.map ( fun value -> { XElement = value })
7592 |> Seq.toArray
7693 with _ when text.TrimStart() .StartsWith " <" ->
77- XDocument.Parse( " <root>" + text + " </root>" , LoadOptions.PreserveWhitespace) .Root.Elements()
94+ use stringReader = new StringReader( " <root>" + text + " </root>" )
95+ use xmlReader = XmlReader.Create( stringReader, xmlReaderSettings)
96+ XDocument.Load( xmlReader, LoadOptions.PreserveWhitespace) .Root.Elements()
7897 |> Seq.map ( fun value -> { XElement = value })
7998 |> Seq.toArray
8099
0 commit comments