在Asp.net 项目程序的Global.asax文件中的事件(按照执行顺序):
Application_Start:应用程序启动时激发 ,只能触发一次,如果应用程序不重启就不会再触发。(通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计的初始化,历史访问人数统计的初始化等等均可在这里定义.)
Application_BeginRquest:http请求开始时激发 ,并且每发生一次请求就会触发。(通常在该方法里过滤一些数据,比如特殊字符过滤、sql注入)
Application_AuthenticateRequest: 应用程序批准http请求时激发 ,事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。预订 AuthenticateRequest事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证。
Session_Start: 会话启动时激发(与用户关联的,每个用户访问时它就触发一次。可以用来创建用户日志,记录访问网站用户的IP地址以及计算在线访问人数总数)
Application_EndRequest:Http请求结束时激发
Session_End:会话结束时激发(使用了session.abandon(),或session超时用户退出后均可触发)
Application_End:应用程序结束时激发。(网站关闭,或重启时,会触发该方法.)
Application_Error: 发生错误时激发
全局过滤恶意提交例子:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
if (Request.QueryString.Count > 0)
{
foreach (string i in Request.QueryString)
{
goError(Request.QueryString[i]);
}
}
//遍历Post参数,隐藏域除外
if (Request.Form.Count > 0)
{
foreach (string i in this.Request.Form)
{
if (i == "__VIEWSTATE") continue;
goError(Request.Form[i].ToString());
}
}
//cookie参数
if (Request.Cookies != null)
{
for (int i = 0; i < Request.Cookies.Count; i++)
{
if (Request.Cookies.Keys[i] == "ManageCookie") continue;
goError(Request.Cookies[Request.Cookies.Keys[i]].Value);
}
}
}
/// <summary>
///SQL注入过滤
/// </summary>
/// <param name="InText">要过滤的字符串 </param>
/// <returns>如果参数存在不安全字符,则返回true </returns>
public void SqlFilterNew(string InText)
{
Response.Write(InText);
string word = "and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join|;|'|--";//这里加要过滤的SQL字符
if (!string.IsNullOrEmpty(InText))
{
foreach (string i in word.Split('|'))
{
InText.Replace(i, "");
}
}
}
private void goError(string text)
{
if (SqlFilter(text))
{
filterContext.Result = new EmptyResult(); //阻止action继续执行
System.Web.HttpContext.Current.Response.Redirect("/Error/Index");
System.Web.HttpContext.Current.Response.End();
}
}