2012-02-12 71 views
1

爲了防止XSS,每當你輸出回用戶輸入時(就像你在顯示輸入錯誤的時候或者當用早先提交的值重新繪製表單一樣),你確實需要轉義html 。這是一個肯定的事......處理htmlescape/htmlspecialchars

所以,做這樣的事情

echo "the name which was supplied as {$_GET['company_name']} is not accepted" 

是不對的。

相反,我們會這樣做。

echo "the name which was supplied as " . htmlspecialchars($_GET['company_name']) . " is not accepted" 

考慮到這一點,在這裏我的問題是;,你是做什麼的$ _GET [「COMPANY_NAME」]需要顯示早在它開始從文本框時?也許你希望你的用戶修改company_name只是因爲它太長了?

如果你使用用htmlspecialchars,如果COMPANY_NAME是說AT & T,該&也就逃脫了,並且顯示爲&放大器;不是嗎?

那麼我們該如何處理這種情況呢?當然,有人可能會說,那麼不要htmlspecialchar它,只是按原樣返回它?

但是然後有人可能會發送一個company_name,這是一個精心製作的停止文本框啓動javascript onclick並從那裏做XSS。

你在這些情況下如何處理htmlescape?只需使用history.go(-1)?

回答

1

如果您有興趣瞭解有關防止XSS的更多信息,我強烈建議您查看OWASP XSS prevention cheat sheet

當瀏覽器呈現HTML(和相關內容,如CSS)時,它會爲不同類型的輸入標識不同的呈現上下文。每個上下文對於如何以及何時可以執行腳本代碼都有不同的語義。因此,您的瀏覽器處理HTML的規則與其用於呈現JavaScript的規則不同,這些規則與CSS的規則不同,等等。這意味着如果您嘗試阻止XSS,則必須對不可信數據的上下文非常敏感。

如果您使用PHP等服務器端代碼將不安全值回送到HTML屬性中(包括表單輸入的值),則需要轉義HTML屬性的文本。假設頁面使用UTF-8編碼,你會做這樣的事情:

<input type="text" value="<?php echo htmlspecialchars($_GET['company_name'], ENT_QUOTES, 'UTF-8'); ?>" > 

的「ENT_QUOTES」選項是非常重要的,因爲它告訴PHP HTML逃逸引號。未轉義的引號可用於「分離」屬性並添加JavaScript事件處理程序,如「onclick」,「onfocus」等。

在您的「AT & T」示例中,在輸入中不會看到&amp;框。這是因爲在一個HTML屬性的情況下,您的瀏覽器呈現HTML實體(如&amp;)作爲他們的相關字符(如&)。

你什麼時候可以在文本框中看到&amp;

如果您使用JavaScript修改輸入的值,您的瀏覽器使用一組不同的規則來確定新的價值將得到處理。如果你想HTML轉義'AT & T',然後使用類似的東西插入新的值,例如。 yourInput.setAttribute(「value」, HtmlEscapingFunction('AT&T')),用戶參見AT&amp;T。這是因爲您現在正在使用DOM執行上下文,並且在DOM執行上下文中,HTML轉義屬性值會導致雙重編碼。