Skip to content

Commit da72f22

Browse files
committed
Potential XXE vulnerability fix.
1 parent 9e8299a commit da72f22

1 file changed

Lines changed: 22 additions & 3 deletions

File tree

src/FSharp.Data.Xml.Core/XmlRuntime.fs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace FSharp.Data.Runtime.BaseTypes
66

77
open System.ComponentModel
88
open System.IO
9+
open System.Xml
910
open 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 = 1024L * 1024L) // 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 = 1024L * 1024L) // 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

Comments
 (0)