2012-01-11 45 views
0

我對防止XSS攻擊有疑問。在HTML中插入DOM時編碼HTML屬性

1)問:

我有一個HTML模板JavaScript字符串(信任)並插入內容從服務器請求(不信任)的到來。我將該HTML模板字符串中的佔位符替換爲不可信內容,並使用innerHTML/Text將其輸出到DOM。

尤其是我在<div><p>中輸出的文本已經存在於模板HTML字符串和表單元素值中,即輸入標籤的value屬性中的文本,select選項和textarea標籤中。

我是否正確理解我可以將上面提到的每個插入文本都視爲HTML子上下文,因此我只編碼如下:encodeForJavascript(encodeForHTML(inserted_text))。或者,是否必須將我插入的文本編碼爲HTML Attribute子上下文的輸入字段的值屬性?

在閱讀關於OWASP的這個問題之後,我傾向於認爲後者只是在必要的情況下通過Javascript設置屬性與不受信任的內容像這樣:document.forms[ 0 ].elements[ 0 ].value = encodeForHTMLAttribute,是否正確?

2)問:

什麼是該通過Ajax進入客戶端並獲得問題1無論如何處理(像)服務器端編碼服務器響應的附加值。另外,當對內容進行雙重編碼時,我們不會冒險嗎?

感謝

回答

1

您需要編碼有問題的情況下,所以要插入到HTML中的上下文數據需要被編碼爲HTML,並將其插入到HTML屬性的數據,應該是HTML屬性編碼。這是你提到的javascript編碼的補充。

我會javascript編碼傳輸,然後編碼正確的上下文客戶端,在哪裏我知道哪個上下文是正確的。

+0

嗨Erlend,感謝您的回覆,但是,我擔心如果我正在處理html上下文或html屬性內容,我仍然不清楚。讓我再試一次,拿這個代碼:'var html =「

(untrusted_2)

」; innerHTML = html;'我在這裏只處理HTML上下文還是必須處理(unstrusted_1)作爲HTML Attribute context?畢竟我插入一個HTML片段不直接處理屬性? – 2012-01-12 07:06:39

+0

通過直接操作DOM從JavaScript設置值時,您不必編碼。 所以document.forms [0] .elements [0] .value = someValue 和document.forms [0] .elements [0] .innerText = someValue 可以用同樣的方法處理。 您只需確保someValue在其定義的javascript上下文中被轉義。 HTML編碼和HTML屬性編碼可以讓HTML解析器正確地構建DOM。所以在您的示例中,您在構建HTML時需要它們。 – Erlend 2012-01-13 05:56:21

+2

非常感謝Erlend, 所以我最初的假設是不正確的。做它的正確的方法是像這樣: '變種htmlAttribute = encodeForJS(encodeForHTMLAttribute(unstrusedInputValue)) VAR的htmlText = encodeForJS(encodeForHTML(unstrusedTextValue)) VAR HTML = 「

<輸入值='」 + htmlAttribute +「' />「+ htmlText +」

「; node.innerHTML = html;' – 2012-01-13 07:06:15