sql注入问题

xizunbo 2009-08-10 02:50:29
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
}
}
...全文
103 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AuC 2009-08-10
  • 打赏
  • 举报
回复
学习了 飘过
wiki14 2009-08-10
  • 打赏
  • 举报
回复
用textbox.maxlength是个好方法.
限制长度还有就是验证码控件.防止一次性注册很多.因为如果他们不够长的话,就减少了贴入大量脚本的可能性。
防止用户输入过长的字符.textbox.maxlength().
限制错误信息给出的提示比如捕获到异常时,只显示一些通用的信息比如"数据源错误",而不是显示"exception.message"的信息,它可能会暴露出你系统的攻击点.
还有就是要小心的去掉特殊字符.
可以将单引号替换为2个单引号.
还有就是使用参数化命令啊,用存储过程执行转换来防止啊
限制用户访问数据库的帐号的权限啊.
zzxap 2009-08-10
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090729/14/26381958-0D6E-4B90-BC90-D275E9621F93.html
「已注销」 2009-08-10
  • 打赏
  • 举报
回复
防注入:参数化sql语句或存储过程
Lovely_baby 2009-08-10
  • 打赏
  • 举报
回复
一,验证方法

/// <summary>
///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");
}
fengjian_428 2009-08-10
  • 打赏
  • 举报
回复
用parameter
zhouyongli41 2009-08-10
  • 打赏
  • 举报
回复

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧