@@ -62,14 +62,34 @@ class PageConfigReader {
6262 }
6363
6464 private fun sanitizeXmlContent (raw : String ): String {
65- return raw
66- .replace(" &" , " &" )
67- .replace(" <" , " <" )
68- .replace(" >" , " >" )
69- .replace(" \" " , " "" )
70- .replace(" '" , " '" )
71- .replace(" §" , " 
" )
72- .replace(Regex (" [\\ x00-\\ x08\\ x0B\\ x0C\\ x0E-\\ x1F]" ), " " )
65+ var result = raw
66+
67+ // 1. Loại bỏ các ký tự không hợp lệ trong XML 1.0
68+ // Giữ lại: TAB (\u0009), LF (\u000A), CR (\u000D)
69+ result = result.replace(
70+ Regex (" [\\ u0000-\\ u0008\\ u000B\\ u000C\\ u000E-\\ u001F\\ uD800-\\ uDFFF\\ uFFFE\\ uFFFF]" ),
71+ " "
72+ )
73+
74+ // 2. Escape '&' nếu chưa phải entity hợp lệ
75+ result = result.replace(
76+ Regex (" &(?!(?:amp|lt|gt|quot|apos|#[0-9]+|#x[0-9A-Fa-f]+);)" ),
77+ " &"
78+ )
79+
80+ // 3. Escape '<' nếu không phải mở đầu markup XML hợp lệ
81+ result = result.replace(
82+ Regex (" <(?!/?[A-Za-z_]|!|\\ ?)" ),
83+ " <"
84+ )
85+
86+ // 4. Escape '>' chỉ khi tạo thành "]]>" ngoài CDATA
87+ result = result.replace(" ]]>" , " ]]>" )
88+
89+ // 5. Quy ước xuống dòng
90+ result = result.replace(" §" , " 
" )
91+
92+ return result
7393 }
7494
7595 constructor (context: Context , pageConfig: String , parentDir: String? ) {
0 commit comments