关于Sql注入式攻击和有害文字的屏蔽功能如何实现??

sula_azoth 2006-08-17 11:35:07
首先,我知道Ado.net中的parameter可以屏蔽。
那么我的环境先陈述一下:

环境:
1.我们使用的数据中间层不是Ado这种微软的通用接口,我们使用的别的公司封装好的数据层,但是它没有提供象微软的parameter的方式。具体的方式如下:

select 字段 from 表 where 条件

那么,这个数据接口定义的,我们给出「字段」,「表」,和「条件」,然后它返回数据集。

这样,如果sql注入式攻击的话,就可以在条件这里做文章了。
比如:条件="a='b' and c='" & textbox1.text & "'"
那么在textbox1.text 输入 "' a='%%' or a='"
这样就形成攻击了。
这个好解决。
我们解决方法是: 写个判断可以输入内容的方法,如果有非法字符,我们就返回false。

2.好,现在问题来了,我们程序是分为控件和画面的,这样修改意味这所有的输入控件都要判断是否合法
但是我们想只是在checkdigit(textbox1.text)这样的方式去修正,如果判断了是非法字符,我就想程序不处理下面的任何程序直接跳到最外层,报msg,然后焦点落在输入不合法的控件上。

这样的解决方法有没有,高手给点合适的方法或者想法。

我想通过throw,但是在那个事件中接获,而且画面不要报error,在page_load是不行的。



...全文
287 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dotnet_boy 2006-08-18
  • 打赏
  • 举报
回复
把下面这段代码加到基类里面,要用的时候继承这个基类,然后直接调用这个方法就OK了!
但不是万能的,有其他情况等需要自己去完善!
/// <summary>
/// 检查用户输入的恶意代码
/// </summary>
public void VerifyUserInput()
{
string tmp ="";

foreach(Control mycontrol in Page.Controls[1].Controls)
{
if (mycontrol.GetType()==typeof(TextBox) || mycontrol.GetType()==typeof(HtmlInputText))
{
//转换成小写
if(mycontrol.GetType()==typeof(HtmlInputText))
{
((HtmlInputText)mycontrol).Value = ((HtmlInputText)mycontrol).Value.Replace("'","‘");
tmp = ((HtmlInputText)mycontrol).Value.ToLower();
}
else
{
((TextBox)mycontrol).Text = ((TextBox)mycontrol).Text.Replace("'","‘");
tmp = ((TextBox)mycontrol).Text.ToLower();
}

if (tmp.IndexOf("select ") >= 0 || tmp.IndexOf("insert ") >= 0 || tmp.IndexOf("update ") >= 0
|| tmp.IndexOf("delete ") >= 0 || tmp.IndexOf("exec ") >= 0 || tmp.IndexOf("declare ") >= 0)
{
Page.Session[PageBase.ErrorMessage] = "输入内容含有敏感字符串,请勿尝试恶意攻击系统!你的登录IP和帐号已被记录!";
Response.Redirect(HttpContext.Current.Request.ApplicationPath + "/web/errorpage.aspx",true);
}
}
}
}
bzhi268 2006-08-18
  • 打赏
  • 举报
回复
顶楼上的
kaijier 2006-08-18
  • 打赏
  • 举报
回复
无聊的很呵
longhorn008 2006-08-18
  • 打赏
  • 举报
回复
有害文字检查可以用下面形式的。。
private bool isValidMemName(string MemberName) //检查用户名非法字符
{
char [] InvalidChar={'$','!','<','>','?','#','^','%','@','~','`','&','*','(',')',';',':','+','=','"','\''};

for(int i=0;i<InvalidChar.Length;i++)
{
if(MemberName.IndexOf(InvalidChar[i])>=0)
return true; //found
}
return false;
}

private bool isForbidMemName(string MemberName) //禁止注册用户名检查
{
string [] ForbidNames=p.Register_UserNames.Split('|');
foreach(string ForbidName in ForbidNames)
{
if(MemberName.ToLower()==ForbidName.ToLower())
return true;
}
return false;

}
longhorn008 2006-08-18
  • 打赏
  • 举报
回复
/// <summary>
/// 过滤非法字符
/// </summary>
/// <param name="theString">传入字符串</param>
/// <returns>过滤后字符串</returns>
public string CheckStr(string theString)
{
string str=theString;
if(str==string.Empty||str==null)
return "";
str=str.Replace("&","&");
str=str.Replace("'","'");
str=str.Replace("\"\"",""");
str=str.Replace("<","<");
str=str.Replace(">",">");
str=Regex.Replace(str,"(w)(here)","$1here",RegexOptions.IgnoreCase);
str=Regex.Replace(str,"(s)(elect)","$1elect",RegexOptions.IgnoreCase);
str=Regex.Replace(str,"(i)(nsert)","$1nsert",RegexOptions.IgnoreCase);
str=Regex.Replace(str,"(c)(reate)","$1reate",RegexOptions.IgnoreCase);
str=Regex.Replace(str,"(d)(rop)","$1rop",RegexOptions.IgnoreCase);
str=Regex.Replace(str,"(a)(lter)","$1lter",RegexOptions.IgnoreCase);
str=Regex.Replace(str,"(d)(elete)","$1elete",RegexOptions.IgnoreCase);
str=Regex.Replace(str,"(u)(pdate)","$1pdate",RegexOptions.IgnoreCase);
return str;

}
游北亮 2006-08-17
  • 打赏
  • 举报
回复
对字符串,过滤掉单引号基本就可以了,
字符串以外的类型就严格判断类型,比如是不是数字等。

sula_azoth 2006-08-17
  • 打赏
  • 举报
回复
呵呵,这个问题我也考虑过,而且写过了,但是javascript有个问题,
1.如果使用让javascript失效的工具。有何安全可言。
GoogleDotNet 2006-08-17
  • 打赏
  • 举报
回复
验证控件,正则表达式
qinhl99 2006-08-17
  • 打赏
  • 举报
回复
方法很多,但最好采用综合的解决方案,包括对非法字符的过滤、采用存储过程、应用及IIS的配置使得不暴露详细的错误信息;
luck0235 2006-08-17
  • 打赏
  • 举报
回复
问题2用得着这么复杂吗?用javascript写成客户端验证不就行了?
sula_azoth 2006-08-17
  • 打赏
  • 举报
回复
主要是问题2,谢谢大家。
sula_azoth 2006-08-17
  • 打赏
  • 举报
回复
呵呵,我说过了,不能使用存储过程,和ADO.net
blackhero 2006-08-17
  • 打赏
  • 举报
回复
存储过程
参数
zxw17594840 2006-08-17
  • 打赏
  • 举报
回复
sql用存储过程最好了,
此外可以用.Replace("'","''");也可以防止大部分的攻击
Knight94 2006-08-17
  • 打赏
  • 举报
回复
一般用Ado.net操作数据库,使用参数就可以了
ohyear 2006-08-17
  • 打赏
  • 举报
回复
问题看的不是很明白,但是防止SQL注入可以用存储过程。有些地方也是可以用验证控件或正则表达式来防止。
三省Ta叔 2006-08-17
  • 打赏
  • 举报
回复
写存储过程啊,避免注入!
edwardfay 2006-08-17
  • 打赏
  • 举报
回复
使用參數或者存儲過程

62,067

社区成员

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

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

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

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