Regex knownBad = new Regex("^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
if(knowBad.IsMatch(InputStr))
{ }
else
{ }上面那个表达式是从书上抄来的,怎么也编译不过去,说无法转义的字符,哪位大哥帮忙调试一下!
if(knowBad.IsMatch(InputStr))
{ }
else
{ }上面那个表达式是从书上抄来的,怎么也编译不过去,说无法转义的字符,哪位大哥帮忙调试一下!
在表达式的“” 前加个 @ 就好了
检测SQL meta-characters的正则表达式 /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(:))/iUNION查询关键字的正则表达式/((\%27)|(\'))union/ix/exec(\s|\+)+(s|x)p\w+/ix这几条配合使用比较好
{
//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不匹配!我晕死!
其攻击的方式都很简单。
你在写sql语句的时候,加上一个字符,如:
select 1 from sys_user where '['+username+']'='['+@username+']' and password=@pwdusername = '[' or ''=']':是不能为真的
如果我用2个 '呢?
我的意思是,发现一个就变成两个,呵呵,永远让 '保持双数出现,你用两个'
我过滤后就变成 4个了,你用3个‘ 过滤后成6个参考如下代码:欢迎大家攻击测试
foreach (char c in SQL_STRING)
if (c=='\'')
result += "''";
else
result += c;
Regex knownBad = new Regex(@"^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
{
//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不匹配!我晕死!
jedliu(21世纪什么最贵? 人才!)
jedliu(21世纪什么最贵? 人才!) :你说的方法,该如何配合使用?能不能举个例子?
ParaType=1,也就是说检查字符型的时候第一个正则表达式没问题,问题是我如果ParaType=0的时候,第二个正则表达式就不起作用,^\d{1,6}$跟11不匹配!,这个正则是判断1,6位整数的,11都通不过!
userpassword=userpassword.Replace("'","");
...
把非法字符替换为空
防止字符转义对于防止sql注入,其实还是使用command对象的参数进行参数传入