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;