防SQL注入的正则表达式!帮忙改一下错!
Regex knownBad = new Regex("^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
if(knowBad.IsMatch(InputStr))
{
}
else
{
}
上面那个表达式是从书上抄来的,怎么也编译不过去,说无法转义的字符,哪位大哥帮忙调试一下!
问题点数:100、回复次数:37Top
1 楼dutguoyi(新鲜鱼排)回复于 2006-04-24 15:36:35 得分 5
正则不是很懂。
还是分开考虑吧。Top
2 楼swazn_yj(菩提本无树)回复于 2006-04-24 16:37:06 得分 0
up!!Top
3 楼zhoujijunnt(---)回复于 2006-04-24 16:50:59 得分 5
顶!Top
4 楼iversonkai(玉凯的困惑)回复于 2006-04-24 16:54:21 得分 10
new Regex(@"^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
在表达式的“” 前加个 @ 就好了
Top
5 楼ocan(OK! I Can!!!)回复于 2006-04-24 16:55:06 得分 5
@Top
6 楼jedliu(21世纪什么最贵? 人才!)回复于 2006-04-24 17:43:48 得分 10
看不懂,给你几条得了
检测SQL meta-characters的正则表达式
/((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(:))/i
UNION查询关键字的正则表达式
/((\%27)|(\'))union/ix
/exec(\s|\+)+(s|x)p\w+/ix
这几条配合使用比较好
Top
7 楼yuanarea(Sail before)回复于 2006-04-24 18:11:01 得分 10
防SQL注入,我的做法很简单:就是永远都支持 ' 这个单引号, 如果发现 ' (写不到数据库),我就加一个配对,成为 '' (可以写入数据库),其他一概不管
这样的方法不知道能注射不?Top
8 楼RUN_(奔跑)回复于 2006-04-24 18:13:42 得分 5
upTop
9 楼swazn_yj(菩提本无树)回复于 2006-04-25 15:49:54 得分 0
To:yuanarea(基于遗传基因、面向女朋友的开发方式) ,这样也不保险!
Top
10 楼swazn_yj(菩提本无树)回复于 2006-04-25 15:52:13 得分 0
public string Input_safe(string InputStr, int StrLen, int ParaType)
{
//InputStr输入的字符,StrLen限制字符的长度,ParaType字符类型,1为字符型,0为数字!
if (InputStr.Length > StrLen)
{
Response.Redirect("Err.aspx?Msg=非法输入1");
}
if (ParaType == 1)
{
Regex reg = new Regex(@"^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
if (reg.IsMatch(InputStr))
{
//Response.Redirect("Err.aspx?Msg=非法输入3");
Response.Write(InputStr + "字符!<br>");
Response.End();
}
else
{
return InputStr;
}
}
else
{
try
{
int fData;
fData = int.Parse(InputStr);
}
catch (FormatException)
{
//Response.Redirect("Err.aspx?Msg=非法输入2");
Response.Write(InputStr + "数字!<br>");
Response.End();
}
Regex reg = new Regex(@"^\d{1," + StrLen + "}$");
Response.Write(reg + "<br>");
if (reg.IsMatch(InputStr))
{
//Response.Redirect("Err.aspx?Msg=非法输入3");
Response.Write(InputStr + "不匹配!<br>");
Response.End();
}
else
{
return InputStr;
}
}
return InputStr;
}
这个当字符是数字的时候不能正确验证,哪位大哥帮忙看看!
^\d{1,6}$跟11不匹配!我晕死!
Top
11 楼Matthewzhong()回复于 2006-04-25 15:59:03 得分 5
用Parameter传值可以避免SQL注入Top
12 楼swazn_yj(菩提本无树)回复于 2006-04-25 16:14:31 得分 0
我是想用正则表达式验证一下!Top
13 楼swazn_yj(菩提本无树)回复于 2006-04-26 09:54:49 得分 0
这个问题我倒没有碰到过,我和楼主也一起学习一下,帮楼主关注并up一下。Top
14 楼swazn_yj(菩提本无树)回复于 2006-04-26 10:23:52 得分 0
up!!!Top
15 楼xrascal(横刀夺爱)回复于 2006-04-26 10:48:05 得分 5
最好的防sql注入的方式应该是使用sql语句参数形式Top
16 楼lovvver(ElephantTalk.Bright)回复于 2006-04-26 10:50:01 得分 10
注入攻击,很好解决。
其攻击的方式都很简单。
你在写sql语句的时候,加上一个字符,如:
select 1 from sys_user where '['+username+']'='['+@username+']' and password=@pwd
username = '[' or ''=']':是不能为真的Top
17 楼swazn_yj(菩提本无树)回复于 2006-04-26 10:53:52 得分 0
up!!!
Top
18 楼xiaomatian(趴趴熊◎%#……※×)回复于 2006-04-26 14:41:16 得分 2
呵呵.我都是用Parameter,然后prepare一下.Top
19 楼swazn_yj(菩提本无树)回复于 2006-04-26 14:54:56 得分 0
up!!Top
20 楼swazn_yj(菩提本无树)回复于 2006-04-27 08:25:31 得分 0
up!!
Top
21 楼swazn_yj(菩提本无树)回复于 2006-04-29 10:56:07 得分 0
up!Top
22 楼boyyao(迷失在网络 (问题不解答扣分也不结贴!))回复于 2006-05-04 22:55:00 得分 2
makeTop
23 楼webwait(webwei)回复于 2006-05-04 23:18:06 得分 2
markTop
24 楼san12655874(小三33)回复于 2006-05-04 23:48:24 得分 2
yuanarea(基于遗传基因、面向女朋友的开发方式) :
如果我用2个 '呢?Top
25 楼yuanarea(Sail before)回复于 2006-05-05 02:26:33 得分 5
....
我的意思是,发现一个就变成两个,呵呵,永远让 '保持双数出现,你用两个'
我过滤后就变成 4个了,你用3个‘ 过滤后成6个
参考如下代码:欢迎大家攻击测试
foreach (char c in SQL_STRING)
if (c=='\'')
result += "''";
else
result += c;
Top
26 楼swazn_yj(菩提本无树)回复于 2006-05-06 18:19:17 得分 0
up!Top
27 楼Radar2006(中华英雄)回复于 2006-05-06 18:31:14 得分 2
mark and up!Top
28 楼radio_3000(学习中……)回复于 2006-05-08 11:01:38 得分 2
关注一下,注入还是很疯狂的。Top
29 楼wangzhenyun_512(explorer)回复于 2006-05-08 11:32:27 得分 5
加@如下
Regex knownBad = new Regex(@"^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");Top
30 楼swazn_yj(菩提本无树)回复于 2006-05-10 08:58:38 得分 0
public string Input_safe(string InputStr, int StrLen, int ParaType)
{
//InputStr输入的字符,StrLen限制字符的长度,ParaType字符类型,1为字符型,0为数字!
if (InputStr.Length > StrLen)
{
Response.Redirect("Err.aspx?Msg=非法输入1");
}
if (ParaType == 1)
{
Regex reg = new Regex(@"^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
if (reg.IsMatch(InputStr))
{
//Response.Redirect("Err.aspx?Msg=非法输入3");
Response.Write(InputStr + "字符!<br/>");
Response.End();
}
else
{
return InputStr;
}
}
else
{
try
{
int fData;
fData = int.Parse(InputStr);
}
catch (FormatException)
{
//Response.Redirect("Err.aspx?Msg=非法输入2");
Response.Write(InputStr + "数字!<br/>");
Response.End();
}
Regex reg = new Regex(@"^\d{1," + StrLen + "}$");
Response.Write(reg + "<br/>");
if (reg.IsMatch(InputStr))
{
//Response.Redirect("Err.aspx?Msg=非法输入3");
Response.Write(InputStr + "不匹配!<br/>");
Response.End();
}
else
{
return InputStr;
}
}
return InputStr;
}
这个当字符是数字的时候不能正确验证,哪位大哥帮忙看看!
^\d{1,6}$跟11不匹配!我晕死!Top
31 楼careast(雅)回复于 2006-05-10 09:03:35 得分 2
To:
jedliu(21世纪什么最贵? 人才!)
Top
32 楼careast(雅)回复于 2006-05-10 09:09:18 得分 0
不小心提交了,不好意思!
To:
jedliu(21世纪什么最贵? 人才!) :你说的方法,该如何配合使用?能不能举个例子?Top
33 楼abandonship(焚酒煮剑)回复于 2006-05-10 09:26:45 得分 2
把报的错误贴出来看看Top
34 楼swazn_yj(菩提本无树)回复于 2006-05-10 09:33:46 得分 0
没报错误,就是我如果输入的参数(string InputStr, int StrLen, int ParaType)
ParaType=1,也就是说检查字符型的时候第一个正则表达式没问题,问题是我如果ParaType=0的时候,第二个正则表达式就不起作用,^\d{1,6}$跟11不匹配!,这个正则是判断1,6位整数的,11都通不过!Top
35 楼junzhang4008(程序可以让尸体动起来)回复于 2006-05-10 09:38:47 得分 2
username=username.Replace("'","");
userpassword=userpassword.Replace("'","");
...
把非法字符替换为空Top
36 楼hyena041(陷入自己的思维中,找不到自己了)回复于 2006-05-10 09:48:15 得分 2
加@符号
防止字符转义
对于防止sql注入,其实还是使用command对象的参数进行参数传入
Top
37 楼swazn_yj(菩提本无树)回复于 2006-05-10 14:57:43 得分 0
up!Top




