黑帽(black hat)SEO主要是指採取“不怎麼道德”(暫時就這麼形容吧!)的方式進行搜尋引擎最佳化。
1. 注入攻擊,包括Sql注入和Html注入。我經常能看到對Sql注入防範的談論,但對於Html注入,很多人並沒有引起足夠的重視。為了展示Html注入的效果,我們模仿了一個常見的留言本功能。
首先,在頁面聲明中添加兩個屬性設定EnableEventValidation=“false” ValidateRequest=“false” ,這很關鍵,讀者可以試一下如果不這樣設定會有什麼效果。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableEventValidation="false" ValidateRequest="false" %> |
然後,前台頁面和後台程式碼片段分別如下:
<asp:TextBox ID="txtInput" runat="server" Height="95px" Width="405px" TextMode="MultiLine"></asp:TextBox> <asp:Button ID="btnSubmit" runat="server" Text="Simple Submit" onclick="btnSubmit_Click" /> <asp:Label ID="lblShow" runat="server"></asp:Label> |
protected void btnSubmit_Click(object sender, EventArgs e) { this.lblShow.Text = this.txtInput.Text; } |
程式很簡單,將使用者輸入的內容再顯示出來而已。運行代碼,然後輸入我們的惡意代碼,提交。
<p>Sanitizing <img src=""INVALID-IMAGE" onerror='location.href="http://too.much.spam/"'>!</p> |
我們會發現頁面自動跳轉到http://too.much.spam/頁面!這就是所謂的“Html注入”。當page頁面render到用戶端後,瀏覽器會按一個普通的html頁面進行解析;當解析到上面的js代碼時……
為了避免這種入侵,在asp.net中,我們最簡單的處理方式就是對輸入的內容進行“Html編碼”。將後台代碼改為:
protected void btnSubmit_Click(object sender, EventArgs e) { this.lblShow.Text = this.Server.HtmlEncode(this.txtInput.Text); } |
現在我們再運行代碼,發現原始碼被原樣輸出顯示在頁面,並沒有運行。為什麼呢?查看輸出頁面的原始碼:
<span id="lblShow"><p>Sanitizing <img src=""INVALID-IMAGE" onerror='location.href="http://too.much.spam/"'>!</p></span>
整理後,我們發現如下的映射轉換:
< -- < (less than)
> -- > (greater than)
" -- " (quota)
所以js無法執行,但在頁面顯示時,我們確能看到“原汁原味”的js內容。
但問題並沒有結束,現實世界中,輸入的內容除了惡意代碼以外,還可能有如下的內容:
<span style=" color:blue">黑帽</span>(black hat)SEO主要是指採取<span style=" color:blue">“不怎麼道德”</span>(暫時就這麼形容吧!)的方式進行搜尋引擎最佳化。 |
我們希望顯示藍色的文字,但經過編碼後,顯然無法達到我們的效果。為此,我們還需要進行更精確的過濾。這也是為什麼之前我們要設定EnableEventValidation=“false” ValidateRequest=“false”的現實原因。
其實我最先想到的方案是:首先對整個內容進行編碼,然後把我們允許使用的html標籤再替換回來。這樣是相當保險的,但是在具體的操作中,遇到了很多問題,這個鬱悶啊~~~(如果有誰有這種實現的實現代碼,千萬要拿出來大家分享一下呀)。
我先介紹另一種方案:
首先要取出標籤,如,<span style=“ color:blue”>、</span>和<script >,我們的替換範圍僅局限於標籤 < > 之間的內容。
然後擷取所有的標籤名稱、屬性的名稱和值,如果有禁止出現的內容,就替換掉。可能的惡意代碼形式如下所示:
標籤的名稱: <script </script
標籤裡的屬性:<span onclick
屬性的值:<img onerror=“javascript:'