封裝惡意字串檢測邏輯,支援 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) + ").*";
}
}
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");
}
SqlParameter、Entity Framework、Dapper 等 ORM 內建參數化結論:本文展示的攔截器僅供教學示範正則與 Global.asax 攔截機制。實務上請採用參數化查詢作為核心防禦,配合多層防護策略。