2011-08-02 108 views
3

<![CDATA[]]>不允許在<![CDATA[ … ]]>塊內。這是可以理解的。什麼是首選方式句柄「<![CDATA [」在<![CDATA [block?

現在,我必須在<![CDATA[ … ]]>塊內傳輸用戶輸入的數據。而惡意用戶可能會輸入<![CDATA[]]>或兩者。

問題是:處理這種情況的首選方法是什麼?

  • Strip <![CDATA[ and ]]>
  • 用空格替換它嗎?
  • 用錯誤信息敲打用戶?
  • 還是有實際傳輸它們的官方方式?
+2

你爲什麼要編寫自己的XML庫?已經有很多成熟的。 – Quentin

+0

@Quentin:在服務器和桌面上,確實有足夠的作業庫。但我爲嵌入式系統(Android)開發。那裏所需的庫只能從2.2版本開始提供。但我們承諾至少2.0兼容我們的客戶。 但我是一個「真正的」程序員,我不介意自己做。 接受可能會驚訝,但有時答案是確實的答案:「你做錯了,試試這個另類」,我可以接受。我不使用CDATA任何以上,但選擇了編碼'<>&「''來代替。 – Martin

回答

2

我認爲你在錯誤地思考CDATA部分--CDATA代表「字符數據」,而CDATA語法只是一段不應被解釋爲標記的數據塊的語法。 CDATA部分可用於將xml文檔嵌入到另一個xml文檔中,但是,如果在文檔中包含字符數據(即文本),則不應將數據的含義包含在CDATA部分中,而只需將其編碼爲文本數據(可能與某些字符轉義)。

這個的簡短版本是你的應用程序不應該在乎數據是否編碼爲CDATA或不是。如果你使用xml類語法編碼的文本不會過於沉重,那麼你最好只是轉義&<個字符 - 這是你的XML API可能爲你做的一切。例如,XmlNode的InnerText屬性將根據需要轉義字符。

如果您仍想使用CDATA標記(轉義大的xml片段可能會過度擴大生成的文檔的大小),那麼您只需要轉義代碼CDATA語法分段(]]>),例如,可以通過只需將]]>替換爲]]]]><![CDATA[>即可。

+0

只有當你能夠重新設計的XML應用程序。這是一個可怕的想法呢‘XML’是簡單的,然後「嵌入XML Base 64編碼數據「,因此要好得多。 – Quentin

+0

@Quentin我意識到這是一個可怕的想法和固定我的答案。 – Justin

+0

後端團隊建議使用'<![CDATA [...]]>'。讀你的評論不知這是一個好主意,因爲我們所說的姓名,地址,電話號碼。'&'應該很少出現,'>'從來沒有在所有。 除非用戶是惡意的,並嘗試一些XML注入。 – Martin

0

如果必須包含該字符串,請使用字符引用代替CDATA。

7

CDATA部分在技術上可以包含另一個起始標記 - <![CDATA[ - 它只是被解釋爲字符數據。它不能包含的是]]>。通常的做法是在編碼時將用戶提供的數據中的CDATA拆分爲]]>。從Wikipedia

CDATA節不能包含字符串「]]>」,因此CDATA節不可能包含嵌套的CDATA節。使用CDATA節編碼包含三元組「」]>「的文本的首選方法是使用多個CDATA節,即在」>「之前分割每個出現的三元組。例如,以編碼 「]]>」 一將寫:

<![CDATA[]]]]><![CDATA[>]]> 

這意味着,要編碼 「]]>」 在CDATA部的中間,取代的「]所有出現] >」用下面的:

]]]]><![CDATA[> 

這有效地停止並重新啓動CDATA部。

[結束維基百科報價]

見什麼在做什麼?實際上,你最終得到的是:

<![CDATA[ ]] ]]> 
<![CDATA[ > ]]> 

(空間添加了強調。)所以,你得到編碼爲旁邊>一個]]]]> - 在解碼過程中的XML處理器一起放回,您將以]]>作爲字符數據,但]]>實際上從未在您的CDATA部分出現。

但是,不應該有任何需要,在這個時代,你可以擔心這個。無論您使用哪種工具/庫創建XML,都應該簡單地爲您進行管理,如果將字符數據放入XML元素中,則應該按照XML庫適合的方式自動轉換爲字符數據,所有必要的轉義,而不必考慮它。

關注惡意用戶數據是很好的,但在這種情況下處理它的最好方法是正確使用一個成熟的庫,其中某個人已經爲你關心了它。

+0

和你談話的工具大約僅適用於Android 2.1的,我要開發Android 1.6。這基本上意味着我不得不寫:-(工具自己。所以,感謝您的回答這是真正需要的。 – Martin