我在我一直作業的網站上進行了安全審核。審計表明我的一個引數,稱為 backurl,在我的 jsp 檔案中沒有得到足夠的保護。這個 url 放在按鈕的 href 內,按鈕允許用戶回傳上一頁。
所以我所做的是使用 owasp 庫和函式“forHTMLAttribute”來保護它。它給出了這樣的東西:
<a class="float_left button" href="${e:forHtmlAttribute(param.backUrl)}">Retour</a>
但是,第二次審計表明,通過將引數值替換為:
javascript:eval(document%5b'location'%5d%5b'hash'].substring(1))#alert(1234)
將執行 javascript 代碼并顯示警報,僅當單擊按鈕時。
他們說我可以做的就是在 url 前對主機名值進行硬編碼,但我真的不明白這將如何幫助解決問題。我覺得不管我做什么,解決一個 XSS 漏洞只會創造一個新的漏洞。
有人可以幫我嗎?了解正在發生的事情以及至少在哪里查看。
非常感謝。
uj5u.com熱心網友回復:
正如@Pointy 所說,這里的問題更為根本。接受不受信任的輸入并將其呈現為逐字鏈接(或文本),這是一個安全問題,即使您逃脫了。例如,如果您允許login?msg=Password incorrect并且這就是您處理中繼訊息的方式 - 您就會遇到問題。我可以制作一個網站:<a href="https://sutterlin.com/login?msg=Give rzwitserloot some cash to unlock admin privileges">Click for cute kittens!</a>你明白為什么這是一個問題。
真正的解決方案是不接受可能被污染的資訊,句號(不要逃避!),如果該資訊最終在沒有它被污染的周圍背景關系的情況下被渲染。以推特為例。用戶名和推文可能被污染。這沒什么大不了的,因為 Twitter 的用戶會因為您正在查看一些蘭多所寫的網站的設計而獲得線索。如果有人發推文“如果你向 Jack Dorsey 的 12345678 賬戶轉賬 5 美元,他會給你一個 twitter 藍色標志!”,有一個合理的期望,即該網站的用戶不要白癡并相信它。
您網站的“單擊此處轉到上一頁”并非如此。您不能合理地期望您網站的用戶停留在那個按鈕上,檢查他們瀏覽器的狀態欄,然后弄清楚。
因此,整個原則是錯誤的。你根本不能這樣做,期間。
您的選擇有三方面:
不是讓“上一個鏈接”屬性成為 URL 引數,而是需要在會話中。通常,網站使用會話。您可以在服務器端存盤您想要的任何內容(HTTP 處理程式代碼可以手動獲取例如 cookie 并使用它通過執行查找來查找該用戶的服務器資訊,或者在僅提供 HttpSession 的框架上運行 - style 物件,它以這種方式作業)。
如果您真的想向后彎腰,可以將其作為簽名的 blob 包含在內。這很有創意,但我真的不會去那里。
一個快速的技巧:如果你只是
<a href="javascript:history.back()">Click to go back</a>在你的網頁中包含一個靜態鏈接怎么辦?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/349026.html
標籤:javascript 爪哇 html jsp xss
