標籤:
首先,建立一個SQLInjectionHelper類完成惡意代碼的檢查
代碼如下:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text.RegularExpressions; /// <summary>///SQLInjectionHelper 的摘要說明/// </summary>public class SQLInjectionHelper{ /// <summary> /// 擷取Post的資料 /// </summary> /// <param name="request"></param> /// <returns></returns> public static bool ValidUrlData(string request) { bool result = false; if (request == "POST") { for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++) { result = ValidData(HttpContext.Current.Request.Form[i].ToString()); if (result) { break; } } } else { for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++) { result = ValidData(HttpContext.Current.Request.QueryString[i].ToString()); if (result) { break; } } } return result; } /// <summary> /// 驗證是否存在注入代碼 /// </summary> /// <param name="inputData"></param> /// <returns></returns> private static bool ValidData(string inputData) { //驗證inputData是否包含惡意集合 if (Regex.IsMatch(inputData, GetRegexString())) { return true; } else { return false; } } /// <summary> /// 擷取Regex /// </summary> /// <returns></returns> private static string GetRegexString() { //構造SQL的注入關鍵字符 string[] strChar = { "and", "exec", "insert", "select", "update", "delete", "count", "from", "drop", "asc", "or", "char", "%", ";", ":", "\‘", "\"", "-", "chr", "master", "mid", "truncate", "declare", "char", "SiteName", "/add", "xp_cmdshell", "net user", "net localgroup administrators", "exec master.dbo.xp_cmdshell" }; string str_Regex = ".*("; for (int i = 0; i < strChar.Length - 1; i++) { str_Regex += strChar[i] + "|"; } str_Regex += strChar[strChar.Length - 1] + ").*"; return str_Regex; }}
有此類後即可使用Global.asax中的Application_BeginRequest(object sender, EventArgs e)事件來實現表單或者URL提交資料的擷取,擷取後傳給SQLInjectionHelper類ValidUrlData方法來完成檢查
代碼如下
protected void Application_BeginRequest(object sender, EventArgs e) { bool result = false; result = SQLInjectionHelper.ValidUrlData(Request.RequestType.ToUpper()); if (result) { Response.Write("您提交的資料有惡意字元"); Response.End(); } }
下面以一個小程式測試:
建立一個頁面,如下
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title></head><body> <form id="form1" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <br /> <asp:Button ID="btnPost" runat="server" Text="擷取Post資料" onclick="btnPost_Click" /> </div> <asp:Button ID="btnGet" runat="server" Text="擷取Get資料" onclick="btnGet_Click" /> </form></body></html>
分別添加單擊事件,如下
protected void btnPost_Click(object sender, EventArgs e) { } protected void btnGet_Click(object sender, EventArgs e) { Response.Redirect("Default.aspx?a=1&b=2&c=3"); }
在文字框中輸入非法字串,無論post請求還是get請求,都會被防SQL注入程式所截獲
圖1 測試防SQL注入程式的頁面
圖2 錯誤資訊
在Global.asax檔案裡實現通用防SQL注入漏洞程式