全站防注入通用程式
在網站根目錄下建立Global.asax應用程式檔案,這新就可以全站防注入了。程式內容如下:
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
//在應用程式啟動時啟動並執行代碼
}
void Application_End(object sender, EventArgs e)
{
//在應用程式關閉時啟動並執行代碼
}
void Application_Error(object sender, EventArgs e)
{
//在出現未處理的錯誤時啟動並執行代碼
}
void Session_Start(object sender, EventArgs e)
{
//在新會話啟動時啟動並執行代碼
}
void Session_End(object sender, EventArgs e)
{
//在會話結束時啟動並執行代碼。
// 注意: 只有在 Web.config 檔案中的 sessionstate 模式設定為
// InProc 時,才會引發 Session_End 事件。如果會話模式
//設定為 StateServer 或 SQLServer,則不會引發該事件。
}
/// <summary>
/// 替換所有注入的字串,並記錄注入時的資訊
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_BeginRequest(object sender, EventArgs e)
{
// * * * * * * * * * * * * * * * * * * * * * * * *
// 全域防注入
// Author:依依秋寒
// * * * * * * * * * * * * * * * * * * * * * * * *
//在接收到一個應用程式請求時觸發。
string[] KeyWords = new string[] { ";", "'", "--", "xp_", "XP_", "xP_", "Xp_" };
string[] safeKeys = ";|'|--|xp_|XP_|xP_|Xp_".Split('|');
string QueryString = Server.UrlDecode(Request.QueryString.ToString());
string url = Request.Url.AbsolutePath;
//排除的副檔名
string[] dotFileName = url.Split('.');
string dotName = dotFileName[dotFileName.Length - 1];
dotFileName = new string[] { "axd" };
//出現被排除的副檔名時,直接退出
foreach (string str in dotFileName)
{
if (str == dotName)
return;
}
for(int i=0;i<KeyWords.Length ;i++)
{
string key = KeyWords[i];
if (QueryString.Contains(key))
{
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//記錄注入時的資訊
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
string IntoRecord = System.DateTime.Now.ToString();
IntoRecord += " " + Request.Url.Host;
IntoRecord += " " + Request.RequestType;
IntoRecord += " " + Request.Url.AbsolutePath;
IntoRecord += " " + Server.UrlDecode(Request.QueryString.ToString());
IntoRecord += " " + Request.UserHostAddress;
IntoRecord += " " + Request.UserAgent;
IntoRecord += "\r";
try
{
string path = Server.MapPath(@"/_IntoRecordLog/");
if (!System.IO.Directory.Exists(path))
System.IO.Directory.CreateDirectory(path);
System.IO.File.AppendAllText(path + DateTime.Now.ToString("yyyyMMdd") + ".log", IntoRecord, System.Text.Encoding.Default);
}
catch { }
//替換注入的URL,並進行跳轉
QueryString = QueryString.Replace(key, safeKeys[i]);
Response.Redirect(url + "?" + QueryString);
Response.End();
}
}
}
</script>