2011-06-26 14 views
6

我開始做一些JS/HTML/CSS。從環顧四面看來,從後端返回HTML並不罕見(例如,Ajax響應),並直接顯示它(例如,通過將其分配給元素的innerHTML)。例如,我相信jQuery的load()方法基本上是做到這一點的捷徑。是否最好避免直接返回HTML以實現Ajax響應?

由於幾個原因,採取這種方法令我感到擔憂,但我不確定是否僅僅是我不熟悉這些領域的方法和習語,而我只是在時代背後,或者這些是否合法關注。我特別關注的問題是:

1)直接將HTML分配給元素似乎並不安全。或者,至少如果有任何用戶內容(甚至是第三方內容)的可能性,至少是危險的。

2)直接發送演示信息(HTML)看起來好像可能導致演示/模型混合,這是最好的避免。當然,將這些數據在後臺完全分離並仍然可以返回HTML是可能的,但在我看到的一些項目中,情況並非如此。

所以,我的問題是,在Ajax應用程序中返回HTML合法形式的HTTP響應還是最好避免?

回答

1

我認爲這取決於用例說實話。如果客戶需要根據一些JSON或XML數據構建大量的HTML,那麼客戶就會付出相當大的代價。我個人使用兩者的混合體 - 如果它只是一小部分數據(一個整數或一個小字符串),我將使用JSON或甚至僅使用原始數據。

如果我要在客戶端格式化一組複雜的數據(比如一堆用戶註釋),那麼我只需發送html並保存客戶端的工作。

就我個人而言,我不會擔心安全問題,至少不會注意到注入惡意HTML的用戶 - 無論如何您都應該處理這個問題。

編輯:這是一個例外 - 當帶寬受到關注(例如移動網絡)時,通過線路發送儘可能少的數據幾乎總是最好的。

+0

謝謝!關於移動的好點。我同意試圖在提交時過濾輸入,但我不認爲它可以完全完成,因爲它將被使用的上下文不能總是被知道 - 可以是HTML,JS或CSS上下文(例如)。 – AlwaysLearning

1

我看不出正確或錯誤的方式來做到這一點,它取決於你發送的數據量和你想要渲染的速度。直接插入HTML 比從JSON或XML構建元素更快。 XSS不應該成爲一個問題,因爲無論您發送的格式如何,您都應該轉義用戶數據。

如果您看一下Facebook,所有XHR響應(據我所見,我只是開始尋找當我看到你的問題:)是這樣的:

for (;;);{"__ar":1,"payload":"\u003cdiv class=\"ego_column\">\u003cdiv 
class=\"ego_section\">\u003cdiv class=\"uiHeader uiHeaderTopAndBottomBorder 
mbs uiSideHeader\">\u003cdiv class=\"clearfix uiHeaderTop\">\u003ca 
class=\"uiHeaderActions rfloat\" href=\"http:\/\/www.facebook.com\/campaign\ 
/landing.php?placement=advf2&campaign_id=368901427978&extra_1=auto\"> 
Create an Ad\u003c\/a>\u003cdiv>\u003ch4 class=\"uiHeaderTitle\">Sponsored 
\u003c\/h4> [...]" } 

他們的AJAX內容很重,所以它可能爲他們發送HTML。可能他們的構架涉及結構 - 呈現分離。

+0

有趣。開始處的無限循環('for(;;);')必須是爲了防止JSON劫持,這是我隱約想到的。是的,輸出應該總是被轉義,但返回的HTML不會在這方面留下任何錯誤空間,而它看起來像使用DOM API。但我相信Facebook對此非常謹慎。 – AlwaysLearning