sql注入有几中方式啊 除了在地址栏直接输入sql还有哪些呢 一般情况下sql注入是以为get为主还是以post为主?sql注入怎么防止注入大量的js? 一下代码防止sql注入有哪些不足?
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
HttpRequest Request = context.Request;
//context.Response.Write("<h1><font color=red>Test: Beginning of Request</font></h1><hr>");
// 过滤字符串
char charzero='\0';
string zero = charzero.ToString();
string strFilter = @"[\S|\s]*[\s|;| |" + zero + @"][and|update|select|exec|insert|delete|declare|truncate]+[\s|;| |" + zero + @"][\S|\s]*";
strFilter += @",[\S|\s]'[\s\s|;| |" + zero + @"][or|and]+[\s|;| |" + zero + @"][\S|\s]*";
string alttxt="and|update|select|exec|insert|delete|declare|truncate";
// 分割后的过滤字符串数组
string[] strf;
strf = strFilter.Split(',');
String Str=Request.AppRelativeCurrentExecutionFilePath;
if (Str.Trim() != "" && !Str.Trim().Contains("/Admin/") && !Str.Trim().Contains("/admin/"))
{
if (Request.RequestType == "GET")
{
#region 过滤GET方式参数
foreach (string strTemp1 in Request.QueryString)
{
if (IsUploadRequest(Request)) break;
foreach (string strTemp2 in strf)
{
Regex r = new Regex(strTemp2);
if (r.IsMatch(Request.QueryString[strTemp1].ToLower()))
{
context.Response.Write("<hr><h1><font color=red>URL地址错误,请从正确地址进入.</font></h1>");
context.Response.End();
}
}
}
#endregion
} else if (Request.RequestType == "POST")
{
#region 过滤POST方式参数
foreach (string strTemp1 in Request.Form)
{
if (IsUploadRequest(Request)) break;
foreach (string strTemp2 in strf)
{
Regex r = new Regex(strTemp2);
if (strTemp1.ToLower() == "__viewstate") continue;
if (r.IsMatch(Request.Form[strTemp1].ToLower()))
{
context.Response.Write("<hr><h1><font color=red>表单中包含非法字符</font></h1><Br>请" + alttxt.Replace("|", ",").ToString() + " 等字符转换成全角,或用空格将字符分开<Br>如and改为a nd或者and,update改为u pdate或者update<Br>如果您的帐户密码是上述字符,请联系管理员<Br><a href='javascript:history.back();'>点此返回上一页。</a>");
context.Response.End();
}
}
}
#endregion
}
}
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
HttpRequest Request = context.Request;
//context.Response.Write("<h1><font color=red>Test: Beginning of Request</font></h1><hr>");
// 过滤字符串
char charzero='\0';
string zero = charzero.ToString();
string strFilter = @"[\S|\s]*[\s|;| |" + zero + @"][and|update|select|exec|insert|delete|declare|truncate]+[\s|;| |" + zero + @"][\S|\s]*";
strFilter += @",[\S|\s]'[\s\s|;| |" + zero + @"][or|and]+[\s|;| |" + zero + @"][\S|\s]*";
string alttxt="and|update|select|exec|insert|delete|declare|truncate";
// 分割后的过滤字符串数组
string[] strf;
strf = strFilter.Split(',');
String Str=Request.AppRelativeCurrentExecutionFilePath;
if (Str.Trim() != "" && !Str.Trim().Contains("/Admin/") && !Str.Trim().Contains("/admin/"))
{
if (Request.RequestType == "GET")
{
#region 过滤GET方式参数
foreach (string strTemp1 in Request.QueryString)
{
if (IsUploadRequest(Request)) break;
foreach (string strTemp2 in strf)
{
Regex r = new Regex(strTemp2);
if (r.IsMatch(Request.QueryString[strTemp1].ToLower()))
{
context.Response.Write("<hr><h1><font color=red>URL地址错误,请从正确地址进入.</font></h1>");
context.Response.End();
}
}
}
#endregion
} else if (Request.RequestType == "POST")
{
#region 过滤POST方式参数
foreach (string strTemp1 in Request.Form)
{
if (IsUploadRequest(Request)) break;
foreach (string strTemp2 in strf)
{
Regex r = new Regex(strTemp2);
if (strTemp1.ToLower() == "__viewstate") continue;
if (r.IsMatch(Request.Form[strTemp1].ToLower()))
{
context.Response.Write("<hr><h1><font color=red>表单中包含非法字符</font></h1><Br>请" + alttxt.Replace("|", ",").ToString() + " 等字符转换成全角,或用空格将字符分开<Br>如and改为a nd或者and,update改为u pdate或者update<Br>如果您的帐户密码是上述字符,请联系管理员<Br><a href='javascript:history.back();'>点此返回上一页。</a>");
context.Response.End();
}
}
}
#endregion
}
}
http://www.cnblogs.com/darkangle/archive/2006/03/29/361903.html
///SQL注入过滤
/// </summary>
/// <param name="InText">要过滤的字符串</param>
/// <returns>如果参数存在不安全字符,则返回true</returns>
public static bool SqlFilter2(string InText)
{
string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join";
if(InText==null)
return false;
foreach(string i in word.Split('|'))
{
if((InText.ToLower().IndexOf(i+" ")>-1)||(InText.ToLower().IndexOf(" "+i)>-1))
{
return true;
}
}
return false;
}二,Global.asax 事件 /// <summary>
/// 当有数据时交时,触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Application_BeginRequest(Object sender, EventArgs e)
{
//遍历Post参数,隐藏域除外
foreach(string i in this.Request.Form)
{
if(i=="__VIEWSTATE")continue;
this.goErr(this.Request.Form.ToString());
}
//遍历Get参数。
foreach(string i in this.Request.QueryString)
{
this.goErr(this.Request.QueryString.ToString());
}
}三,Global中的一个方法 /// <summary>
/// 校验参数是否存在SQL字符
/// </summary>
/// <param name="tm"></param>
private void goErr(string tm)
{
if(WLCW.Extend.CValidity.SqlFilter2(tm))
this.Response.Redirect("/error.html");
}
限制长度还有就是验证码控件.防止一次性注册很多.因为如果他们不够长的话,就减少了贴入大量脚本的可能性。
防止用户输入过长的字符.textbox.maxlength().
限制错误信息给出的提示比如捕获到异常时,只显示一些通用的信息比如"数据源错误",而不是显示"exception.message"的信息,它可能会暴露出你系统的攻击点.
还有就是要小心的去掉特殊字符.
可以将单引号替换为2个单引号.
还有就是使用参数化命令啊,用存储过程执行转换来防止啊
限制用户访问数据库的帐号的权限啊.