<![CDATA[
和]]>
不允許在<![CDATA[ … ]]>
塊內。這是可以理解的。什麼是首選方式句柄「<![CDATA [」在<![CDATA [block?
現在,我必須在<![CDATA[ … ]]>
塊內傳輸用戶輸入的數據。而惡意用戶可能會輸入<![CDATA[
或]]>
或兩者。
問題是:處理這種情況的首選方法是什麼?
- Strip
<![CDATA[
and]]>
? - 用空格替換它嗎?
- 用錯誤信息敲打用戶?
- 還是有實際傳輸它們的官方方式?
<![CDATA[
和]]>
不允許在<![CDATA[ … ]]>
塊內。這是可以理解的。什麼是首選方式句柄「<![CDATA [」在<![CDATA [block?
現在,我必須在<![CDATA[ … ]]>
塊內傳輸用戶輸入的數據。而惡意用戶可能會輸入<![CDATA[
或]]>
或兩者。
問題是:處理這種情況的首選方法是什麼?
<![CDATA[
and ]]>
?我認爲你在錯誤地思考CDATA部分--CDATA代表「字符數據」,而CDATA語法只是一段不應被解釋爲標記的數據塊的語法。 CDATA部分可用於將xml文檔嵌入到另一個xml文檔中,但是,如果在文檔中包含字符數據(即文本),則不應將數據的含義包含在CDATA部分中,而只需將其編碼爲文本數據(可能與某些字符轉義)。
這個的簡短版本是你的應用程序不應該在乎數據是否編碼爲CDATA或不是。如果你使用xml類語法編碼的文本不會過於沉重,那麼你最好只是轉義&
和<
個字符 - 這是你的XML API可能爲你做的一切。例如,XmlNode的InnerText屬性將根據需要轉義字符。
如果您仍想使用CDATA標記(轉義大的xml片段可能會過度擴大生成的文檔的大小),那麼您只需要轉義代碼CDATA語法分段(]]>
),例如,可以通過只需將]]>
替換爲]]]]><![CDATA[>
即可。
如果必須包含該字符串,請使用字符引用代替CDATA。
CDATA部分在技術上可以包含另一個起始標記 - <![CDATA[
- 它只是被解釋爲字符數據。它不能包含的是]]>
。通常的做法是在編碼時將用戶提供的數據中的CDATA拆分爲]]>
。從Wikipedia:
CDATA節不能包含字符串「]]>」,因此CDATA節不可能包含嵌套的CDATA節。使用CDATA節編碼包含三元組「」]>「的文本的首選方法是使用多個CDATA節,即在」>「之前分割每個出現的三元組。例如,以編碼 「]]>」 一將寫:
<![CDATA[]]]]><![CDATA[>]]>
這意味着,要編碼 「]]>」 在CDATA部的中間,取代的「]所有出現] >」用下面的:
]]]]><![CDATA[>
這有效地停止並重新啓動CDATA部。
[結束維基百科報價]
見什麼在做什麼?實際上,你最終得到的是:
<![CDATA[ ]] ]]>
<![CDATA[ > ]]>
(空間添加了強調。)所以,你得到編碼爲旁邊>
一個]]
的]]>
- 在解碼過程中的XML處理器一起放回,您將以]]>
作爲字符數據,但]]>
實際上從未在您的CDATA部分出現。
但是,不應該有任何需要,在這個時代,你可以擔心這個。無論您使用哪種工具/庫創建XML,都應該簡單地爲您進行管理,如果將字符數據放入XML元素中,則應該按照XML庫適合的方式自動轉換爲字符數據,所有必要的轉義,而不必考慮它。
關注惡意用戶數據是很好的,但在這種情況下處理它的最好方法是正確使用一個成熟的庫,其中某個人已經爲你關心了它。
和你談話的工具大約僅適用於Android 2.1的,我要開發Android 1.6。這基本上意味着我不得不寫:-(工具自己。所以,感謝您的回答這是真正需要的。 – Martin
在CDATA部分,全部更換]]>
與]]]]><![CDATA[>
你爲什麼要編寫自己的XML庫?已經有很多成熟的。 – Quentin
@Quentin:在服務器和桌面上,確實有足夠的作業庫。但我爲嵌入式系統(Android)開發。那裏所需的庫只能從2.2版本開始提供。但我們承諾至少2.0兼容我們的客戶。 但我是一個「真正的」程序員,我不介意自己做。 接受可能會驚訝,但有時答案是確實的答案:「你做錯了,試試這個另類」,我可以接受。我不使用CDATA任何以上,但選擇了編碼'<>&「''來代替。 – Martin