2015-09-22 67 views
0

由於消息中的消息屬性文件:HTML標記佔位符 - XSS潛在

message = Change relation <strong>{0}</strong> -> <strong>{1}</strong> to <strong>{2}</strong> -> <strong>{3}</strong>?

如果任何佔位符的內容是用戶的影響字符串,我需要到html爲了防止潛在的XSS(我通過在我的JSP模板中使用c:out標記來做到這一點,我想我也可以使用spring:message標記的htmlEscape屬性,但我認爲沒有區別)。

但是通過這樣做,我在郵件中標記損壞,從而導致輸出<strong>等:

Change relation <strong>Peter</strong> -> <strong>Car</strong> to <strong>Carl</strong> -> <strong>Bus</strong>?

我已經讀線程這裏on stackoverflow但它並沒有解決XSS 。

我正在考慮這些選項:

1)只需從信息的屬性替換所有<strong>標籤用單引號文件。那麼html轉義整個消息就沒有問題了,但是消息的特定部分略顯突出。

2)將消息拆分爲允許(JSP)模板中單獨標記的部分。爲了獲得正確的標記,這感覺很像工作。

我在這裏錯過了什麼嗎?哪種方法更好,還是有其他選擇?

編輯:沒有HTML轉義的消息是,就像我希望它是這樣的:

變化關係彼得 - >汽車卡爾 - >總線

因此,message.properties文件中的html標記正在呈現在模板中時呈現。

當轉義時,消息如上所示,向我顯示<strong>標記而不是呈現它們。

+0

你是說它會導致輸出:'<強>彼得< /強>'?就我所知,因爲你的「損壞的」例子與原始信息完全一樣。 – Gray

+0

嗨,對不起,我編輯了我的問題,試圖澄清我的情況一些。 – SebastianRiemer

+0

謝謝澄清。如果您查看HTML(查看源代碼),您會發現實際上,您將「<」發送給客戶端而不是「<」。所以,我相信我的答案仍然存在 - 讓我知道如果它不清楚或者我誤解了你的問題。 – Gray

回答

1

去,你得到以下輸出的假設下:

Change relation &lt;strong&gt;Peter&lt;/strong&gt; -&gt; &lt;strong&gt;Car&lt;/strong&gt; to &lt;strong&gt;Carl&lt;/strong&gt; -&gt; &lt;strong&gt;Bus&lt;/strong&gt;

它看起來像你逃避你的整個HTML字符串,而不是隻需要進行轉義的部分。

您應該自行跳過每個{#}值,然後將其放入HTML中。您需要轉義的常規值爲:<,>,',"&,但如果可以,請使用防xss庫和模板系統。

一旦你逃脫了所有潛在的危險部件,你可以使用像<c:out value="${msg}" escapeXml="false"/>之類的東西。這不是我所知道的語言/框架,但是您需要某種方式來輸出實際的HTML與轉義的版本。無論你喜歡什麼方式,只要你能夠正確逃避不可信任的部分,就應該沒問題。

+1

我同意這一部分,我只應該逃避消息中不可信的部分。 這會讓我選擇在傳遞給消息之前將參數*轉義出來,然後如您所說,在渲染時不會轉義消息。 – SebastianRiemer

+1

只是FYI,我已經通過用單引號替換屬性文件中的標記來解決我的問題。 但我很確定,要走的路就是在將消息傳遞給消息的同時簡單地轉義消息參數,然後在不帶* html轉義的情況下呈現消息*。 謝謝@格雷! – SebastianRiemer