14.44-16.22 編碼,跨站腳本攻擊1
16.22-16.53 整理cnblog
這篇文章適合知道有XSS腳本攻擊,但是一頭霧水,從未操作過,也不知道腳本攻擊會給客戶端用戶帶來什么不便之處,有什么危害。
通過Asp.net實現搜索功能,你提交了搜索條件后都在搜索框下方第一行顯示 “您搜索的內容是:xxxx”
1.頁面有3個控件, 一個 輸入框(txtSearch),一個搜索按鈕(btn),一個div (id=”result” runat=”server”)
- <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
- CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" ValidateRequest="false" %>
- <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
- </asp:Content>
- <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
- <asp:TextBox ID="txtSearch" runat="server"></asp:TextBox><asp:Button ID="btn"
- runat="server" Text="" onclick="btn_Click" />
- <div id="result" runat="server">
- </div>
- </asp:Content>
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- namespace WebApplication1
- {
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- }
- protected void btn_Click(object sender, EventArgs e)
- {
- result.InnerHtml = ": " + txtSearch.Text.Trim();
- //result.InnerHtml = ": " + HttpUtility.HtmlEncode(txtSearch.Text.Trim());
- }
- }
- }
分別在IE 和CHROME下分別測試
1. 在IE 和 chrome 下
1)搜索sdf,IE,chrome正常顯示:您搜索的內容是:sdf
2 )搜索內容為: </div><script type="text/javascript">alert('跨站攻擊鳥')</script><div>
您搜索的內容是 這段字符串是放在一個<div></div>
如果我們搜索 </div><script type="text/javascript">alert('跨站攻擊鳥')</script>
則 這段字符串變為 <div> </div><script type="text/javascript">alert('跨站攻擊鳥')</script><div> </div>,簽名2個div就閉合了,中間一個元素為script元素,最后div也閉合了
- IE下展示為:
此處就彈出了對話框。對其他用戶有什么威脅呢?僅針對此情況來說,正常情況下,A用戶提交內容后,服務器都會將內容保存到數據庫服務器中,那么B用戶如果訪問到了A用戶評論的那個界面就會彈出上面的對話框。這就影響了網站整體體驗。
解決辦法: 后台給div賦值時候,請用html encode編碼
將上面btn按鈕的事件代碼改成 result.InnerHtml = "您搜索的內容是: " + HttpUtility.HtmlEncode(txtSearch.Text.Trim()) 就行了
如下圖,就不會彈出對話框來了,而是將搜索內容完全展示出來鳥
我們來查看html源碼,看見 html標簽信息都被編碼了,這樣瀏覽器就不知道這是一個腳本代碼
<div id="MainContent_result">您搜索的內容是: </div><script type="text/javascript">alert('跨站攻擊鳥')</script><div></div>
- chrome瀏覽器訪問
居然什么都不顯示,並且瀏覽器捕捉到了一些錯誤哦,提示xss攻擊
於是這個alert就不執行了。
本實例項目下載地址----->XSS實例1.zip
總結:
1.可見IE瀏覽器的安全性真夠糟糕,簡單的xss腳本攻擊都不做任何處理。所以大家盡量少用IE瀏覽器,盡量用火狐,谷歌的,並盡量使用最新版的。
2.解決辦法就是:保存用戶提交的數據后再展示之前一定要進行html encode編碼再展示
3. asp.net 默認機制 input value 提交后,返回的內容在你不賦值之前一定是html encode編碼,就像剛才提交的 </div>…<div>那段,返回的input value 就為<script type="text/javascript">alert('跨站攻擊鳥')</script> 當然如果你賦值了,就以你賦值的為算。