首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

Global.asax 實作全域 SQL 注入防護機制(支援 POST/GET)

     編輯:ASP.NET 基礎

核心防護類別:SQLInjectionHelper

封裝惡意字串檢測邏輯,支援 POST 表單與 GET 查詢字串雙重防護。

public class SQLInjectionHelper
{
    /// 
    /// 驗證請求資料是否包含 SQL 注入特徵
    /// 
    public static bool ValidUrlData(string requestType)
    {
        bool result = false;
        if (requestType == "POST")
        {
            for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++)
            {
                result = ValidData(HttpContext.Current.Request.Form[i].ToString());
                if (result) break;
            }
        }
        else // GET
        {
            for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++)
            {
                result = ValidData(HttpContext.Current.Request.QueryString[i].ToString());
                if (result) break;
            }
        }
        return result;
    }

    private static bool ValidData(string input)
    {
        return Regex.IsMatch(input, GetRegexString());
    }

    private static string GetRegexString()
    {
        string[] patterns = { 
            "and", "exec", "insert", "select", "update", "delete", "count", "from", "drop",
            "asc", "or", "char", "%", ";", ":", "'", "\"", "-", "chr", "master", "mid",
            "truncate", "declare", "xp_cmdshell", "net user", "net localgroup administrators",
            "exec master.dbo.xp_cmdshell"
        };
        return ".*(" + string.Join("|", patterns) + ").*";
    }
}

Global.asax 攔截請求

protected void Application_BeginRequest(object sender, EventArgs e)
{
    bool isMalicious = SQLInjectionHelper.ValidUrlData(Request.RequestType.ToUpper());
    if (isMalicious)
    {
        Response.Write("您提交的資料包含惡意字元,請求已攔截。");
        Response.End();
    }
}

測試頁面範例

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html><body>
<form id="form1" runat="server">
    <asp:TextBox ID="TextBox1" runat="server" /><br />
    <asp:Button ID="btnPost" runat="server" Text="送出 POST" OnClick="btnPost_Click" />
</form>
<asp:Button ID="btnGet" runat="server" Text="送出 GET" OnClick="btnGet_Click" />
</body></html>
protected void btnGet_Click(object sender, EventArgs e)
{
    Response.Redirect("Default.aspx?a=1&b=2&c=3");
}

⚠️ 重要安全提醒

此方案存在嚴重缺陷,不建議用於生產環境:

  • 誤判率極高:正常文字(如 "update"、"select"、"from")會被誤攔截
  • 繞過風險:編碼、大小寫變形、註釋語法均可繞過簡單正則
  • 效能影響:每個請求皆執行正則比對,高流量下拖慢回應
  • 缺乏語境感知:無法區分惡意載荷與正常業務資料

現代防護最佳實務

  1. 參數化查詢:使用 SqlParameter、Entity Framework、Dapper 等 ORM 內建參數化
  2. 輸入驗證:白名單驗證(型別、長度、格式、允許字元),而非黑名單過濾
  3. 最小權限:資料庫連線帳號僅授予必要權限(SELECT/INSERT/UPDATE),禁止 DDL、系統預存程序
  4. WAF 防火牆:部署 Azure WAF、ModSecurity、Cloudflare 等雲端/網路層防護
  5. 參數化存儲程序:複雜邏輯封裝於參數化 Stored Procedure

結論:本文展示的攔截器僅供教學示範正則與 Global.asax 攔截機制。實務上請採用參數化查詢作為核心防禦,配合多層防護策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved