Der er et trick, der bruger den implicitte konvertering af VARBINARY
til base64 og tilbage:
Her er din liste over ondskab
DECLARE @evilChars VARCHAR(MAX)=CHAR(0x0)+ CHAR(0x1)+ CHAR(0x2)+ CHAR(0x3)+ CHAR(0x4)+ CHAR(0x5)+ CHAR(0x6)+ CHAR (0x7)+ CHAR(0x8)+ CHAR(0x9)+ CHAR(0xa)+ CHAR(0xb)+ CHAR(0xc)+ CHAR(0xd)+ CHAR(0xe)+ CHAR(0xf)+ CHAR(0x10)+ CHAR (0x11)+ CHAR(0x12)+ CHAR(0x13)+ CHAR(0x14)+ CHAR(0x15)+ CHAR(0x16)+ CHAR(0x17)+ CHAR(0x18)+ CHAR(0x19)+ CHAR(0x1a)+ CHAR (0x1b)+ CHAR(0x1c)+ CHAR(0x1d)+ CHAR(0x1e)+ CHAR(0x1f)+ CHAR(0x7f);
Dette virker
DECLARE @XmlAsString NVARCHAR(MAX)=( SELECT @evilChars FOR XML PATH('test'));SELECT @XmlAsString;
Resultatet (nogle er "udskrevet")
x17;
Følgende er forbudt
SELECT CAST(@XmlAsString AS XML)
Men du kan bruge den implicitte konvertering af VARBINARY til base64
DECLARE @base64 NVARCHAR(MAX)=( SELECT CAST(@evilChars AS VARBINARY(MAX)) FOR XML PATH('test'));SELECT @base64;
Resultatet
AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh9/
Nu har du din rigtige XML inklusive specialtegnene !
SELECT CAST(CAST(@base64 AS XML).value('/test[1]','varbinary(max)') AS VARCHAR(MAX)) FOR XML PATH('reconverted')
Resultatet
x18;