簡體   English   中英

在Java中轉義html

[英]Escaping html in Java

我如何確保兩次逃脫?

我聽說它是​​一種很好的做法,可以在從表單中接收值時轉義值,並在輸出時轉義。 這樣你就有兩次抓住機會的機會。

我假設您正在使用JSP。

只在展示期間逃脫。 JSTL <c:out>標簽非常適用。 默認情況下,它會轉義HTML實體。 使用它來顯示每個用戶控制的輸入,例如請求URL,請求標頭和請求參數。

例如

<input type="text" name="foo" value="<c:out value="${param.foo}" />">

不需要在輸入期間轉義。 XSS不會損害原始Java代碼或SQL數據庫。 另一方面,您還希望在數據庫中保存未修改的數據,以便您仍然可以看到用戶實際輸入的內容,以便您可以在必要時對郵件用戶執行社交操作。

如果您想知道在輸入期間要逃避什么,那將是SQL注入 在這種情況下,只要您想在數據庫中保存任何用戶控制的輸入,只需使用PreparedStatement而不是常規Statement

例如

create = connection.prepareStatement("INSERT INTO user (username, password) VALUES (?, MD5(?))");
create.setString(1, username);
create.setString(2, password);
create.executeUpdate();

當您向瀏覽器輸出內容時,您應該只進行html編碼。 這可以防止XSS攻擊。 在將表單中的數據插入數據庫之前從表單中收集數據時所執行的轉義不是 html編碼。 它正在逃避特殊的數據庫字符(最好使用參數化查詢)。 其目的是防止SQL注入攻擊。 所以沒有雙重編碼。

在一個上下文中無害的內容在另一個上下文中可能是危險的。 避免注入攻擊的最佳方法是在將內容傳遞到另一個上下文之前准備內容。 在您的情況下,html文本在傳遞給瀏覽器時會更改其上下文。 服務器不呈現html,但瀏覽器不呈現。 因此,請務必不要將惡意html傳遞給瀏覽器並在發送之前屏蔽它。

這樣做的另一個論點是,攻擊代碼可能是從兩個或多個輸入組合在應用程序中的。 每個輸入都是無害的,但它們一起變得危險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM