防止sql数据库注入js木马解决方案
以前写过一些网站,有漏洞,到了五一、十一这些节日的时候老被注入js木马,但是通过在Global.asax加入一些过滤字符就解决了,但是最近又出现了这种现象,加了Global.asax也没用了,最后通过网友的帮忙和自己在网上找的一些资料解决了一下,目前还没出问题,现在贴出来供大家分享下。
以前的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,则不会引发该事件。
}
void Application_BeginRequest(Object sender, EventArgs e)
{
StartProcessRequest();
}
#region SQL注入式攻击代码分析
/// <summary>
/// 处理用户提交的请求
/// </summary>
private void StartProcessRequest()
{
try
{
string getkeys = "";
string sqlErrorPage = "err.html";//转向的错误提示页面
if (System.Web.HttpContext.Current.Request.QueryString != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i]; //post 提交
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i]; //get 提交
if (getkeys == "__VIEWSTATE") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{
// 错误处理: 处理用户提交信息!
}
}
/// <summary>
/// 分析用户请求是否正常
/// </summary>
/// <param name="Str">传入用户提交数据 </param>
/// <returns>返回是否含有SQL注入式攻击代码 </returns>
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "and¦exec¦insert¦select¦delete¦update¦count¦*¦chr¦mid¦master¦truncate¦char¦declare¦net user¦xp_cmdshell¦/add¦exec master.dbo.xp_cmdshell¦net localgroup administrators";
string[] anySqlStr = SqlStr.Split('¦');
foreach (string ss in anySqlStr)
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
#endregion
</script>
这种方法对一些低手黑客就够用了,可是对高手还是有点缺。
新的解决方法:
1、新建一个名字为WebUtils.cs的类,在类中添加一个GetQueryInt的方法,用于获取Url中的int类型值。
/// <summary>
/// 获得指定Url参数的int类型值
/// </summary>
/// <param name="strName">Url参数</param>
/// <param name="defValue">缺省值</param>
/// <returns>Url参数的int类型值</returns>
public static int GetQueryInt(string strName, int defValue)
{
return DataConverter.StrToInt(HttpContext.Current.Request.QueryString[strName], defValue);
}
2、新建一个名字为DataConvert.cs的操作类,在类中添加一个StrToInt的方法,用于将Url中获取值转化成int类型值
/// <summary>
/// string型转换为int型
/// </summary>
/// <param name="strValue">要转换的字符串</param>
/// <param name="defValue">缺省值</param>
/// <returns>转换后的int类型结果</returns>
public static int StrToInt(object strValue, int defValue)
{
if ((strValue == null) || (strValue.ToString() == string.Empty) || (strValue.ToString().Length > 10))
{
return defValue;
}
string val = strValue.ToString();
string firstletter = val[0].ToString();
if (val.Length == 10 && DataValidate.IsNumber(firstletter) && int.Parse(firstletter) > 1)
{
return defValue;
}
else if (val.Length == 10 && !DataValidate.IsNumber(firstletter))
{
return defValue;
}
int intValue = defValue;
if (strValue != null)
{
bool IsInt = new Regex(@"^([-]|[0-9])[0-9]*$").IsMatch(strValue.ToString());//正则判断,过滤字符
if (IsInt)
{
intValue = Convert.ToInt32(strValue);
}
}
return intValue;
}
/// <summary>
/// 判断给定的字符串(strNumber)是否是数值型
/// </summary>
/// <param name="strNumber">要确认的字符串</param>
/// <returns>是则返加true 不是则返回 false</returns>
public static bool IsNumber(string strNumber)
{
return Regex.IsMatch(strNumber, "^[0-9]+$");
}
3、在资讯或者产品的终极展示页面获取其编号并进行转换
int id = WebUtils.GetQueryInt("id", -1);