@@ -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,16 @@ 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
66+ ) // 1MB limit
67+
68+ use xmlReader = XmlReader.Create( reader, xmlReaderSettings)
69+ let element = XDocument.Load( xmlReader, LoadOptions.PreserveWhitespace) .Root
6070 { XElement = element }
6171
6272 /// <exclude />
@@ -69,12 +79,26 @@ type XmlElement =
6979 use reader = reader
7080 let text = reader.ReadToEnd()
7181
82+ // Secure XML parsing: disable DTD processing and external entities to prevent XXE attacks
83+ let xmlReaderSettings =
84+ new XmlReaderSettings(
85+ DtdProcessing = DtdProcessing.Prohibit,
86+ XmlResolver = null ,
87+ MaxCharactersFromEntities = 1024 L * 1024 L
88+ ) // 1MB limit
89+
7290 try
73- XDocument.Parse( text, LoadOptions.PreserveWhitespace) .Root.Elements()
91+ use stringReader = new StringReader( text)
92+ use xmlReader = XmlReader.Create( stringReader, xmlReaderSettings)
93+
94+ XDocument.Load( xmlReader, LoadOptions.PreserveWhitespace) .Root.Elements()
7495 |> Seq.map ( fun value -> { XElement = value })
7596 |> Seq.toArray
7697 with _ when text.TrimStart() .StartsWith " <" ->
77- XDocument.Parse( " <root>" + text + " </root>" , LoadOptions.PreserveWhitespace) .Root.Elements()
98+ use stringReader = new StringReader( " <root>" + text + " </root>" )
99+ use xmlReader = XmlReader.Create( stringReader, xmlReaderSettings)
100+
101+ XDocument.Load( xmlReader, LoadOptions.PreserveWhitespace) .Root.Elements()
78102 |> Seq.map ( fun value -> { XElement = value })
79103 |> Seq.toArray
80104
0 commit comments