最近公司网站老是被黑,帮忙优化下,但是公司网站是用.net写的,一点都不懂,在网上查了个方法,说是在global.asax里面加个方法,于是去找,没找到那个文件,于是把原系统加载到编译器中重新生成了这个文件,复制上去那段代码,结果没用,代码如下
<%@ Application Language="C#" %><script runat="server"> void Application_BeginRequest(object sender, EventArgs e)
{
Response.Write("您提交的内容中含有非法字符,已经被拒绝.");
//遍历Post参数,隐藏域除外
if (Regex.IsMatch(Request.RawUrl.ToLower(), @"/manager/")==false)
for (int i=0; i < Request.Form.Count;i++)
{
if (Request.Form[i].ToString() == "__VIEWSTATE") continue;
if (IsDanger(Request.Form[i].ToString()))
{
Response.Write("您提交的内容中含有非法字符,已经被拒绝.");
Response.End();
} }
//过滤所有Url中的危险字符串
if (Request.QueryString.Count > 0 && Regex.IsMatch(Request.RawUrl.ToLower(), @"\.aspx") == true && Regex.IsMatch(Request.RawUrl.ToLower(), @"fckeditor") == false)//如果防止截获fckeditor正常的Url,必须验证".aspx"
{
string Temp = "";
//string Url = Request.Url.AbsoluteUri.Substring(0, Request.Url.AbsoluteUri.LastIndexOf("?"));
string Url = Request.RawUrl.Substring(0, Request.RawUrl.LastIndexOf("?"));
for (int i = 0; i < this.Request.QueryString.Count; i++)
{
try
{
Temp = HandleRequestParam(this.Request.QueryString[i].ToString());
Url += i == 0 ? "?" : "&";
Url += Request.QueryString.Keys[i].ToString() + "=" + Temp;
}
catch { }
}
//if (Url.Length < Request.Url.AbsoluteUri.Length)
// Response.Redirect(Url);
Context.RewritePath(Url);//可以用Response.Redirect和Context.RewritePath
} //全站防止页面缓存
Response.Buffer = true;
Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
Response.Expires = 0;
Response.CacheControl = "no-cache";
} protected string HandleRequestParam(string str)
{
string RetStr = "";
char[] strC = str.ToLower().ToCharArray();
for (int i = 0; i < strC.Length; i++)
{
if (Convert.ToInt32(strC[i]) >= 48 && Convert.ToInt32(strC[i]) <= 57)
RetStr += strC[i].ToString();
else
break;
}
return RetStr;
} protected bool IsDanger(string InText)
{
string word = @"exec|insert|select|delete|update|master|truncate|char|declare|join|iframe|href|script|<|>|request";
if (InText == null)
return false;
if (Regex.IsMatch(InText,word))
return true;
return false;
}
</script>
网上说要什么编译之类的,我都没有,我直接把源码放到服务器上(因为服务器就是公司单独的一台机子),iis设置下就能访问了,但是我加那段代码是要过滤请求传过来的危险字符,但是我在浏览器中输入类似如下的包含select的路径
http://localhost/Company/News.aspx?id=(select Type from news where id=2)
结果还是没反应,不是我要求的提示含有非法字符。怎么改呢?我是2天前解除.net的,可能犯了基础的错误,跪求高人帮忙!
<%@ Application Language="C#" %><script runat="server"> void Application_BeginRequest(object sender, EventArgs e)
{
Response.Write("您提交的内容中含有非法字符,已经被拒绝.");
//遍历Post参数,隐藏域除外
if (Regex.IsMatch(Request.RawUrl.ToLower(), @"/manager/")==false)
for (int i=0; i < Request.Form.Count;i++)
{
if (Request.Form[i].ToString() == "__VIEWSTATE") continue;
if (IsDanger(Request.Form[i].ToString()))
{
Response.Write("您提交的内容中含有非法字符,已经被拒绝.");
Response.End();
} }
//过滤所有Url中的危险字符串
if (Request.QueryString.Count > 0 && Regex.IsMatch(Request.RawUrl.ToLower(), @"\.aspx") == true && Regex.IsMatch(Request.RawUrl.ToLower(), @"fckeditor") == false)//如果防止截获fckeditor正常的Url,必须验证".aspx"
{
string Temp = "";
//string Url = Request.Url.AbsoluteUri.Substring(0, Request.Url.AbsoluteUri.LastIndexOf("?"));
string Url = Request.RawUrl.Substring(0, Request.RawUrl.LastIndexOf("?"));
for (int i = 0; i < this.Request.QueryString.Count; i++)
{
try
{
Temp = HandleRequestParam(this.Request.QueryString[i].ToString());
Url += i == 0 ? "?" : "&";
Url += Request.QueryString.Keys[i].ToString() + "=" + Temp;
}
catch { }
}
//if (Url.Length < Request.Url.AbsoluteUri.Length)
// Response.Redirect(Url);
Context.RewritePath(Url);//可以用Response.Redirect和Context.RewritePath
} //全站防止页面缓存
Response.Buffer = true;
Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
Response.Expires = 0;
Response.CacheControl = "no-cache";
} protected string HandleRequestParam(string str)
{
string RetStr = "";
char[] strC = str.ToLower().ToCharArray();
for (int i = 0; i < strC.Length; i++)
{
if (Convert.ToInt32(strC[i]) >= 48 && Convert.ToInt32(strC[i]) <= 57)
RetStr += strC[i].ToString();
else
break;
}
return RetStr;
} protected bool IsDanger(string InText)
{
string word = @"exec|insert|select|delete|update|master|truncate|char|declare|join|iframe|href|script|<|>|request";
if (InText == null)
return false;
if (Regex.IsMatch(InText,word))
return true;
return false;
}
</script>
网上说要什么编译之类的,我都没有,我直接把源码放到服务器上(因为服务器就是公司单独的一台机子),iis设置下就能访问了,但是我加那段代码是要过滤请求传过来的危险字符,但是我在浏览器中输入类似如下的包含select的路径
http://localhost/Company/News.aspx?id=(select Type from news where id=2)
结果还是没反应,不是我要求的提示含有非法字符。怎么改呢?我是2天前解除.net的,可能犯了基础的错误,跪求高人帮忙!
解决方案 »
- 请教一个多条件组合查询的问题 怎么实现?c# winform
- listview空白区
- C#调用C++dll函数时char**输出参数问题
- 只是在form中添加了一个按纽,就出现:未处理的“System.ArithmeticException”类型的异常出现在 system.drawing.dll 中??
- 为什么这样的C#代码不能编译!
- c#的C/S(即服务器/客户端)结构程序的开发思路,所用技术是什么??
- 请问如何实现处理信息的即时显示?
- 严重鄙视: riffleliu(流水) ( )
- 在ASP_NET中的嵌套属性为什么不能实现?(UP有分)
- 关于文件的问题?
- 关于枚举的那些事,快来看看吧.
- 发现TreeView的一个bug
{ //SQL防注入
string Sql_1 = "and|or|join|exec|insert+|select+|delete+|update+|count|chr|mid|master+|truncate|char|declare|drop+|drop+table|creat+|creat+table";
string Sql_2 = "exec+|insert|insert+|delete+|update+|count(|count+|chr+|+mid(|+mid+|+master+|truncate+|char+|+char(|declare+|drop+|creat+|drop+table|creat+table";
string[] sql_c = Sql_1.Split('|');
string[] sql_c1 = Sql_2.Split('|'); if (Request.QueryString != null)
{
foreach (string sl in sql_c)
{
if (Request.QueryString.ToString().ToLower().IndexOf(sl.Trim()) >= 0)
{
Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");//
Response.Write(sl);
Response.Write(Request.QueryString.ToString());
Response.End();
break;
}
}
}
if (Request.Form.Count > 0)
{
string s1 = Request.ServerVariables["SERVER_NAME"].Trim();//服务器名称
if (Request.ServerVariables["HTTP_REFERER"] != null)
{
string s2 = Request.ServerVariables["HTTP_REFERER"].Trim();//http接收的名称
string s3 = "";
if (s1.Length > (s2.Length - 7))
{
s3 = s2.Substring(7);
}
else
{
s3 = s2.Substring(7, s1.Length);
}
if (s3 != s1)
{
Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");//
Response.End();
}
}
}
}
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,则不会引发该事件。 }
</script>
谢谢,但是我已经用了你的了,还是没反应额,我在浏览器输入框内输入包含select之类的字符还是没有提示额,为什么呢?