diff --git a/Prelude/XML/render.dhall b/Prelude/XML/render.dhall
index ff07a8021..10652cbd0 100644
--- a/Prelude/XML/render.dhall
+++ b/Prelude/XML/render.dhall
@@ -1,10 +1,6 @@
{-|
Render an `XML` value as `Text`
-*WARNING:* rendering does not include any XML injection mitigations,
-therefore it should not be used to process arbitrary strings into
-element attributes or element data.
-
For indentation and schema validation, see the `xmllint` utility
bundled with libxml2.
@@ -48,15 +44,23 @@ let emptyAttributes =
let Attr = { mapKey : Text, mapValue : Text }
-let `escape"` = Text/replace "\"" "\\\""
+let esc = λ(x : Text) → λ(y : Text) → Text/replace x "&${y};"
+
+let `escape&` = esc "&" "amp"
+
+let `escape<` = esc "<" "lt"
+
+let `escape>` = esc ">" "gt"
+
+let `escape'` = esc "'" "apos"
-let `escape<` = Text/replace "<" "\\<"
+let `escape"` = esc "\"" "quot"
-let `escape&` = Text/replace "&" "\\&"
+let escapeCommon = λ(text : Text) → `escape<` (`escape&` text)
-let escapeText = λ(text : Text) → `escape<` (`escape&` text)
+let escapeAttr = λ(text : Text) → `escape"` (`escape'` (escapeCommon text))
-let escapeAttr = λ(text : Text) → `escape"` (`escape<` (`escape&` text))
+let escapeText = λ(text : Text) → `escape>` (escapeCommon text)
let renderAttr = λ(x : Attr) → " ${x.mapKey}=\"${escapeAttr x.mapValue}\""
@@ -123,9 +127,7 @@ let example1 =
"\n"
""
''
-
- \<>'"\&
-
+ <>'"&
''
in render
diff --git a/Prelude/package.dhall b/Prelude/package.dhall
index b38fae1e9..faa364093 100644
--- a/Prelude/package.dhall
+++ b/Prelude/package.dhall
@@ -38,6 +38,6 @@
./Text/package.dhall sha256:17a0e0e881b05436d7e3ae94a658af9da5ba2a921fafa0d1d545890978853434
? ./Text/package.dhall
, XML =
- ./XML/package.dhall sha256:8f57bda3087cbb34568d58e5dd5ee6860a50576caf48ebe49a5fc60b9af9a1fa
+ ./XML/package.dhall sha256:6a15ea2ab1918f97374ec2fe3b90c056fb807fb3a90c1c44ce9fb9233f59c0e5
? ./XML/package.dhall
}