js注入
什么是javascript注入攻擊?
每當接受用戶輸入的內容並重新顯示這些內容時,網站就很容易遭受 JavaScript 注入攻擊。讓我們研究一個容易遭受 JavaScript 注入攻擊的具體應用程序。假設已經創建了一個客戶反饋網站。客戶可以訪問網站並輸入對產品的反饋信息。當客戶提交反饋時,反饋信息重新顯示在反饋頁面上。
客戶反饋網站是一個簡單的網站。不幸的是,此網站容易遭受 JavaScript 注入攻擊。
假設正在將以下文本輸入到客戶反饋表單中:
<script>alert(“Attack!”)</script>
此文本表示顯示警告消息框的 JavaScript 腳本。在某人將此腳本提交到客戶反饋表單后,消息Attack! 會在將來任何人訪問客戶反饋網站時顯示。
這只是一個簡單的小例子,或許你會認為這種攻擊根本無傷大雅嘛,但如果這個消息被注入了一個數據表,而網站的公共頁面會請求這個數據表里的內容,那么不幸的是,任何人訪問這個公共頁面都會彈出一個框,讓人一看就感覺這個網站好粗糙,不安全。
那么,還有更不幸的,如果有人利用你的js注入漏洞,不是注入的這么一行簡單的代碼,而是要執行一個跨站腳本,發送一個請求,就可以將你網站甚至數據表里的數據(包括一些用戶信息)發送到遠程服務器上了,例 如,黑客可以使用 JavaScript 注入攻擊竊取來自其他用戶瀏覽器的 Cookies 值。如果將敏感信息(如密碼、信用卡帳號或社會保險號碼)保存在瀏覽器 Cookies 中,那么黑客可以使用 JavaScript 注入攻擊竊取這些信息。或者,如果用戶將敏感信息輸入到頁面的表單字段中,而頁面受到 JavaScript 攻擊的危害,那么黑客可以使用注入的 JavaScript 獲取表單數據並將其發送到另一個網站。
解決辦法
方法一
阻止 JavaScript 注入攻擊的一種簡單方法是重新在視圖中顯示數據時,用 HTML 編碼任何網站用戶輸入的數據
如:
<%=Html.Encode(feedback.Message)%>
使用 HTML 編碼一個字符串的含意是什么呢?使用 HTML 編碼字符串時,危險字符如 < 和 > 被替換為 HTML 實體,如 < 和 >。所以,當使用 HTML 編碼字符串 <script>alert("Boo!")</script> 時,它將轉換為 <script>alert("Attack!")</script>。瀏覽器在解析編碼的字符串時不再執行 JavaScript 腳本。而是顯示無害的頁面。
方法二
除了在視圖中顯示數據時使用 HTML 編碼數據,還可以在將數據提交到數據庫之前使用 HTML 編碼數據。
通常,人們喜歡使用本教程中討論的第一種方法,而不喜歡使用第二種方法。第二種方法的問題在於在數據庫中最終會保留 HTML 編碼的數據。換言之,數據庫中的數據會包含奇怪的字符。這有什么壞處呢?如果需要用除網頁以外的形式顯示數據庫數據,則將遇到問題。例如,不能輕易在 Windows Forms 應用程序中顯示數據。