asp.net里如何防 'or'='or' 在线等待~~
ASP。NET中具体应该怎么做。。。小弟菜鸟一只,大侠们尽量说仔细些 在线等 问题点数:20、回复次数:96Top
1 楼hxylqm6()回复于 2006-07-03 09:49:59 得分 0
我SQL语句是这么写的:
select * from AdminInfo where UserName='"+TextBox1.text+"' and PassWord='"+TextBox2.Text+"'
应该如何修改啊?
Top
2 楼WeekZero(∮小气的鬼∮)回复于 2006-07-03 09:52:46 得分 0
http://weekzero.cnblogs.com/archive/2005/12/19/300208.htmlTop
3 楼hxylqm6()回复于 2006-07-03 09:55:13 得分 0
楼上哥哥发的文章 看不太懂啊~~~本人实在很菜,能不能详细告诉我应该怎么做Top
4 楼liujiweijun(流流)回复于 2006-07-03 09:56:08 得分 0
SQL漏洞Top
5 楼francsescoli(我爱世界杯)回复于 2006-07-03 09:56:27 得分 0
使用存储过程,可以解决SQL注入攻击问题,把你的这个语句写成存储过程调用。
或者使用这个方法,去掉非法字符,可以更改正则表达式来符合自己。
public static string InputText(string text, int maxLength)
{
text = text.Trim();
if (string.IsNullOrEmpty(text))
return string.Empty;
if (text.Length > maxLength)
text = text.Substring(0, maxLength);
text = Regex.Replace(text, "[\\s]{2,}", " "); //two or more spaces
text = Regex.Replace(text, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)", "\n"); //<br>
text = Regex.Replace(text, "(\\s*&[n|N][b|B][s|S][p|P];\\s*)+", " "); //
text = Regex.Replace(text, "<(.|\\n)*?>", string.Empty); //any other tags
text = text.Replace("'", "''");
return text;
}Top
6 楼WeekZero(∮小气的鬼∮)回复于 2006-07-03 09:56:36 得分 0
string a = TextBox1.text.CompareTo("") == 0 ? "" : TextBox1.text.Replace("'", "’");
string b = TextBox2.text.CompareTo("") == 0 ? "" : TextBox2.text.Replace("'", "’");
select * from AdminInfo where UserName='"+a+"' and PassWord='"+b+"'
这个就可以这样来处理了Top
7 楼cic_wxf(我憎恨这个社会,但是不想报复这个社会)回复于 2006-07-03 09:58:07 得分 0
使用参数可以避免
比如 "select * from table where username=@username"
然后给@username赋值就可以了Top
8 楼saintqiqi(钻石星辰(www.saintzone.net))回复于 2006-07-03 09:58:08 得分 0
<SCRIPT language="JavaScript">
function IsValid( oField )
{
re= /select|update|delete|exec|count|'|"|=|;|>|<|%/i;
$sMsg = "请您不要在参数中输入特殊字符和SQL关键字!"
if ( re.test(oField.value) )
{
alert( $sMsg );
oField.value = '';
oField.focus();
return false;
}
}
</SCRIPT>Top
9 楼jijl2001(jijl2001)回复于 2006-07-03 09:59:29 得分 0
传参的时候过滤一下就行了,还有有参数式的,不要拼sql语句Top
10 楼hxylqm6()回复于 2006-07-03 10:00:14 得分 0
哇 我才给20分就这么多哥哥帮忙,感动的哇哇哭Top
11 楼hxylqm6()回复于 2006-07-03 10:00:59 得分 0
个人还是喜欢 javascript 做判断。Top
12 楼lizheng__114(浪淘沙)回复于 2006-07-03 10:08:20 得分 0
对于sql注入,其实是个老生常谈的问题,解决的办法有很多
我用的办法就是写个类,对于传过来的参数进行判断,用replace方法进行安全过滤
如:replace("'","");等等,进行一系列的判断后,被sql注入的机会就会大大降低
再就是用存储过程,声明变量类型后,被sql注入的机会也比较小了
相关资料去google搜索:sql注入 资料太多太多Top
13 楼mendel(风逍遥)回复于 2006-07-03 10:12:34 得分 0
你把空格过滤成 就行了Top
14 楼jimu8130(火箭的未来在哪里?)回复于 2006-07-03 10:13:46 得分 0
个人还是喜欢 javascript 做判断?
==!
要是用js来作不划算啊,何况就算你能避免了or or ,那么还有其他情况了?比如or 1=1了?
象使用参数能尽量避免, "select * from table where username=@username"然后给@username赋值就可以了;sql注入漏洞防不胜防啊Top
15 楼hxylqm6()回复于 2006-07-03 10:15:46 得分 0
还是用 javascript做判断吧。那位哥哥能详细写段完整代码!!
照顾下我这初学的小菜鸟Top
16 楼heyidan(gopee)回复于 2006-07-03 10:17:08 得分 0
方法1
select * from AdminInfo where UserName='"+TextBox1.text.Replace("'","''")+"' and PassWord='"+TextBox2.Text.Replace("'","''")+"'
方法2
使用參數
comm.Paremeters.Add("@userName",SqlDbType.varchar).Value=Textbox1.text;
comm.Paremeters.Add("@passWord",SqlDbType.varchar).Value=Textbox2.text;
comm.commandText="select * from AdminInfo where UserName=@userName and PassWord=@passWord";
這2种方法都可以防止sql注入式攻擊Top
17 楼saintqiqi(钻石星辰(www.saintzone.net))回复于 2006-07-03 10:17:59 得分 0
你去
http://www.saintzone.net/secure/login.aspx
查看源文件就知道了Top
18 楼teacher1998(英语+asp.net+MsSQL)回复于 2006-07-04 08:23:43 得分 0
记号Top
19 楼wls12342004(青青子木)回复于 2006-07-04 08:35:56 得分 0
用参数形式Top
20 楼coolxyq(锦上添花)回复于 2006-07-04 08:53:43 得分 0
我就不用字符转换,这代码你们谁能破的了?谁告诉你们非得判断用户?
"select * from user where pwd='" +MD5(pwd)+"'"
if(dr["user"]==user){
}
联系qq:21536535Top
21 楼coolxyq(锦上添花)回复于 2006-07-04 08:57:13 得分 0
你就用'or'='or'做用户,"and select delete"做密码都 没问题
我习惯于不给机会
交个朋友:21536535Top
22 楼sung_yuri(北京人)回复于 2006-07-04 08:57:48 得分 0
呵呵。。这牛人用什么MD5不要充高手啊Top
23 楼gngnandgngn(仗义执言 )回复于 2006-07-04 08:58:16 得分 0
用户名和密码禁止空格, 然后查询时把空格过滤掉, 应该就能防止注入式攻击了Top
24 楼coolxyq(锦上添花)回复于 2006-07-04 09:02:50 得分 0
md5只是代表我加密而已,事实上我在网上随便下了个md5软件,然后做的时候把他改的面目全非,验证时候连上用户名加密到192位,亲爱的sung_yuri(81年的我们),我只是说个思想而已,没必要抓芝麻放西瓜吧?还是我的做法确实有问题?Top
25 楼junzhang4008(程序可以让尸体动起来)回复于 2006-07-04 09:06:30 得分 0
哈哈。直接字符替换把
把所有的非法字符全部过滤之后在进行sql查询
'过虑非法字符
ParaValue = replace(ParaValue,"'","")
ParaValue = replace(ParaValue,"select ","")
ParaValue = replace(ParaValue,"insert ","")
ParaValue = replace(ParaValue,"delete ","")
ParaValue = replace(ParaValue,"count(","")
ParaValue = replace(ParaValue,"drop table ","")
ParaValue = replace(ParaValue,"update ","")
ParaValue = replace(ParaValue,"truncate ","")
ParaValue = replace(ParaValue,"asc(","")
ParaValue = replace(ParaValue,"mid(","")
ParaValue = replace(ParaValue,"char(","")
ParaValue = replace(ParaValue,"xp_cmdshell","")
ParaValue = replace(ParaValue,"exec master","")
ParaValue = replace(ParaValue,"net localgroup administrators","")
ParaValue = replace(ParaValue," and ","")
ParaValue = replace(ParaValue,"net user","")
ParaValue = replace(ParaValue," or ","")
Top
26 楼coolxyq(锦上添花)回复于 2006-07-04 09:09:33 得分 0
还有密码必须加密,这已经是常识了啊,难道不是么?
难道你们为了展示自己的正则表达式实力,就不用加密功能?Top
27 楼kaijier(<空杯子>)回复于 2006-07-04 10:12:41 得分 0
典型“问题复杂化”Top
28 楼yesur(夜隼)回复于 2006-07-04 10:16:22 得分 0
永远不要拼凑SQL语句,Top
29 楼belllab(菜鸟)回复于 2006-07-04 10:49:11 得分 0
coolxyq(锦上添花)的用法太单一了点,一是只允许一个字段进行查询,二是用了加密方式,特指在这登录的这没问题,但如果用在其它的查询的地方时就会出问题,一是查询肯定不止一个条件,那就肯定会用到AND OR等,二是数据字段不可能去加密吧?Top
30 楼coolxyq(锦上添花)回复于 2006-07-04 11:03:13 得分 0
第一:lz问的只是登陆这块,我也只是针对登陆,而且能绝对破解sql注入
第二:单一的程序功能少,但漏洞也少
第三:要实现复杂查询的话,那就看谁的代码漏洞小了,这方面我研究少,不做评论Top
31 楼coolxyq(锦上添花)回复于 2006-07-04 11:05:45 得分 0
而且我写的程序思想比较通用,就算你以后用jsp。net,php100等等都能用Top
32 楼shamao(稳重,踏实,责任)回复于 2006-07-04 12:05:29 得分 0
mkTop
33 楼phommy(石头,竹子,诗)回复于 2006-07-04 14:32:12 得分 0
我就不用字符转换,这代码你们谁能破的了?谁告诉你们非得判断用户?
"select * from user where pwd='" +MD5(pwd)+"'"
if(dr["user"]==user){
}
联系qq:21536535
--------------
如果有用户设了同样的密码呢...
防登录时的SQL注入,只要过滤单引号就足够了~Top
34 楼llainn(得之不幸,失之不忧.)回复于 2006-07-04 14:45:27 得分 0
使用參數
comm.Paremeters.Add("@userName",SqlDbType.varchar).Value=Textbox1.text;
comm.Paremeters.Add("@passWord",SqlDbType.varchar).Value=Textbox2.text;
comm.commandText="select * from AdminInfo where UserName=@userName and PassWord=@passWord";
Top
35 楼VincentLiang(梁俊)回复于 2006-07-04 14:54:44 得分 0
將 TextBox2.Text中的内容,一個單引號,替換成兩個單引號Top
36 楼myminimouse(坚决不用baidu)回复于 2006-07-04 14:57:09 得分 0
永远不要拼凑SQL语句,
Top
37 楼coolxyq(锦上添花)回复于 2006-07-04 15:09:29 得分 0
回答phommy(顽石宫主)
办法1. pwd=同时加密user和pwd
办法2。循环相同密码,然后判断用户
Top
38 楼cat_hsfz(我的新Blog在http://cathsfz.cnblogs.com)回复于 2006-07-04 16:32:37 得分 0
防止注入漏洞的方法很简单,把所有"'"都replace为"''"就可以了,不需要复杂的正则表达式匹配。只要做了这个replace,就不能通过手动输入单个"'"来关闭你的字符串,这样无论别人之后跟的是"or true"或者什么的,都一律还是被当作字符串内容来处理,直到遇到你原本的"'"才承认关闭字符串。
当然,人手去replace的话,很可能你会忘记为某些地方添加replace,所以ADO.NET的标准做法是用SqlCommand(或者其他数据库的Command类),然后让它对你的Parameter进行界限符与转义符的处理。Top
39 楼mingwj1980()回复于 2006-07-04 21:51:48 得分 0
markTop
40 楼caicaibao(菜菜(包))回复于 2006-07-04 22:16:31 得分 0
cat_hsfz(我的Blog在http://purl.oclc.org/NET/cathsfz) 说的非常对,自己写个类写对SQL的Parameter进行replace就可以了,没必要那么复杂Top
41 楼mextb1860()回复于 2006-07-05 00:01:22 得分 0
使用SQL参数就可以了Top
42 楼chinank(中国南开)回复于 2006-07-05 08:21:00 得分 0
难为楼主了。就是个注入的问题,正如大家所言,replace就可以了,针对你的问题,只需要把单撇替换位中文的单引号就没有问题了,诸如此类的注入还有多种,需要你慢慢体会了。Top
43 楼lhx1977(清水无鱼)回复于 2006-07-05 10:09:01 得分 0
使用存储过程是比较好 的选择。
Top
44 楼guaigaihu(三根金发)回复于 2006-07-05 10:55:41 得分 0
就是在输入时,去掉用户输入的单双引号,等于号Top
45 楼calfenyin(小钢哥)回复于 2006-07-05 11:05:00 得分 0
sqlcommand才是王道Top
46 楼boyd1985(波伊德乐园->http://www.boyd.cn)回复于 2006-07-05 11:36:34 得分 0
可以考虑用加密方法,像MD5、HASHTop
47 楼nickppa(张)回复于 2006-07-05 11:41:35 得分 0
这种问题就结贴了吧,已经好几个人说了用传参数的方式来搞了,还加密,换字符。。。Top
48 楼zwrtv(蝙蝠)回复于 2006-07-05 11:52:31 得分 0
收藏备用Top
49 楼smile9961(good life)回复于 2006-07-05 11:53:05 得分 0
同意catTop
50 楼lincai(隐身)回复于 2006-07-05 12:26:25 得分 0
用参数才是王道Top
51 楼kgdiwss(∮明天去要饭)回复于 2006-07-05 12:33:01 得分 0
把取得的参数过滤一下就好喽.没什么难的.Top
52 楼tabris17(四不象)回复于 2006-07-05 13:07:50 得分 0
只要把一个单引号替换成2个就可以了
无需其他过滤
特别是过滤sql关键字,纯属不懂装董Top
53 楼hsingbo()回复于 2006-07-05 13:24:45 得分 0
用@就可以了!
??=@??Top
54 楼ioleon13(我落日般的忧伤就像惆怅的飞鸟,惆怅的飞鸟飞成我落日般的忧伤)回复于 2006-07-05 13:25:06 得分 0
markTop
55 楼phommy(石头,竹子,诗)回复于 2006-07-05 14:13:51 得分 0
coolxyq(锦上添花) ( ) 信誉:100 2006-7-4 15:09:29 得分: 0
回答phommy(顽石宫主)
办法1. pwd=同时加密user和pwd
办法2。循环相同密码,然后判断用户
受教了 感觉第1种方法非常棒!Top
56 楼hertcloud(·£孙子兵法£·)回复于 2006-07-05 14:39:04 得分 0
#region 过滤SQL参数
/// <summary>
/// 过滤html
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public string FilterSQL(string text)
{
string validSql = "";
if (text != null)
{
text = text.Replace("\"", """);
text = text.Replace(";", "");
//text = text.Replace("'", "''");
// text = text.Replace("--", "''--''");
text = text.Replace("%25", "");
text = text.Replace("%0a", "");
text = text.Replace("%22", "");
text = text.Replace("%27", "");
text = text.Replace("%5c", "");
text = text.Replace("%2f", "");
text = text.Replace("%3c", "");
text = text.Replace("%3e", "");
text = text.Replace("%26", "");
text = text.Replace("<", "<");
text = text.Replace(">", ">");
validSql = text;
}
return validSql;
}
#endregionTop
57 楼kaijier(<空杯子>)回复于 2006-07-05 14:42:53 得分 0
晕!
构建SQL串前,将源单引号替换为双单引号,谁能进行所谓的“注入”,我给他磕头!
注:字段类型为“字符串”。Top
58 楼cbo5()回复于 2006-07-05 14:59:19 得分 0
参数
存储过程Top
59 楼agaovxy(啊高)回复于 2006-07-05 15:06:52 得分 0
UserName = Replace(Trim(Request.Form("Name")),"'","''")
TempUserPass = Replace(Trim(Request.Form("Password")),"'","''")Top
60 楼tabris17(四不象)回复于 2006-07-05 15:13:30 得分 0
phommy(顽石宫主) ( ) 信誉:100 2006-07-05 14:13:00 得分: 0
coolxyq(锦上添花) ( ) 信誉:100 2006-7-4 15:09:29 得分: 0
回答phommy(顽石宫主)
办法1. pwd=同时加密user和pwd
办法2。循环相同密码,然后判断用户
受教了 感觉第1种方法非常棒!
==========================
最愚蠢的方法,不懂装董的人想出来的Top
61 楼imafool(中正仁和)回复于 2006-07-05 15:29:01 得分 0
看了半天没个好的……Top
62 楼agaovxy(啊高)回复于 2006-07-05 15:30:24 得分 0
不知道那位说要用javascript验证, 难道你不怕站外提交,所以还是服务端验证好.Top
63 楼hooyke(红旗下的蛋)回复于 2006-07-05 15:38:14 得分 0
UserName 先在数据库里判断是否有匹配 如果有 再 判断是否 pwd匹配Top
64 楼leveretzhang(张忠伟)回复于 2006-07-05 15:44:56 得分 0
只要 trim() 就可以避免了Top
65 楼jazzking746(迪奥尼所思)回复于 2006-07-05 16:20:52 得分 0
coolxyq(锦上添花) ( ) 信誉:100 2006-7-4 15:09:29 得分: 0
回答phommy(顽石宫主)
办法1. pwd=同时加密user和pwd
办法2。循环相同密码,然后判断用户
请教个问题 嗯 用md5加密好像不可返回 要是想要找回密码 怎么办呢? 怎么实现?
我在毕业设计中实现不了 直接让用户重新输入改写密码了......
想请教正规的方法 谢谢了Top
66 楼jwt3000(风)回复于 2006-07-05 16:55:13 得分 0
userdb=new Users();
if(uname.LastIndexOf("'")!=-1||pwd.LastIndexOf("'")!=-1)
return null;
else
return userdb.UserLoginDB(uname,pwd);Top
67 楼sunj2ee(心态决定一切)回复于 2006-07-05 17:07:36 得分 0
使用参数最简单了Top
68 楼icuc88(职业特种兵)回复于 2006-07-05 17:19:44 得分 0
晕,就是用参数就搞定了。Top
69 楼xingdongfang(xingdongfang)回复于 2006-07-05 17:20:49 得分 0
comm.Paremeters.Add("@userName",SqlDbType.varchar).Value=Textbox1.text;
comm.Paremeters.Add("@passWord",SqlDbType.varchar).Value=Textbox2.text;
comm.commandText="select * from AdminInfo where UserName=@userName and PassWord=@passWord";Top
70 楼ztwz(-_-b(偶要像海绵一样的狂吸水水!))回复于 2006-07-05 17:32:47 得分 0
markTop
71 楼xiaozhimin1978(小灰狼)回复于 2006-07-05 22:26:29 得分 0
看样子这里有很多人是原ASP程序员,在 asp 里好象必须要拼SQL语句
其实楼上已经有好几位大侠说了,用参数就可以了,不管是 SqlCommand, OleDbCommand 还是别的什么Command ,都可以用参数。Top
72 楼mrzj(mrzj)回复于 2006-07-05 23:01:59 得分 0
使用存储过程或者用参数传递。
二是过滤到所有的空格(20)、换行(13)、回车(10)、Tab符(9)也行。Top
73 楼ExeMan(愚公移山(笨)--精卫填海(傻))回复于 2006-07-06 00:43:37 得分 0
收藏Top
74 楼beijingbeerman(啤酒肚)回复于 2006-07-06 08:33:04 得分 0
markTop
75 楼IamRobert(罗伯特)回复于 2006-07-06 10:13:36 得分 0
说的不错,还是用传参方式更合理些,毕竟不是所有的地方都需要这么严格的校验的。Top
76 楼nanxi0532()回复于 2006-07-06 10:31:30 得分 0
正则表达式不允许空格不就行了Top
77 楼calfenyin(小钢哥)回复于 2006-07-06 11:02:18 得分 0
这么简单的问题还这么多人回复,人家现成的SqlCommand,OledbCommand不用,连加密都弄出来了,真是笑死人了
Top
78 楼DragonCity1()回复于 2006-07-06 13:09:30 得分 0
呵呵,一贯使用Parameter,很简单。Top
79 楼Edisoncat(http://www.Edisonliu.com)回复于 2006-07-06 13:32:01 得分 0
用set/getTop
80 楼Bandry(菜鸟-舍我其谁)回复于 2006-07-06 14:27:44 得分 0
把-- ; 去掉或替换掉就没问题了吧Top
81 楼levinknight(Coral)回复于 2006-07-06 14:53:03 得分 0
用参数Top
82 楼vance2005()回复于 2006-07-06 15:27:43 得分 0
过滤‘'’换成''''Top
83 楼xiaozhimin1978(小灰狼)回复于 2006-07-06 16:36:19 得分 0
用参数就完全可以搞定了,并且参数的功能比一般的拼装 sql 语句强得多,不用写什么 replace,不用过滤,不用什么正则表达式,不用。。。。。。
楼主快结帖啦Top
84 楼yhjwii(逍遥飘流)回复于 2006-07-06 16:46:32 得分 0
方法N多种,呵呵.正则表达式.
传参,替换.呵呵.Top
85 楼wenzhousun()回复于 2006-07-06 17:49:42 得分 0
upTop
86 楼nooning(nooning)回复于 2006-07-06 18:16:37 得分 0
不应该是过滤,应该是转义
对于SQL,你只要转义一个字符就可以了 那就是把 '==>''
用正则也可以,用replace当然是最方便Top
87 楼boyyao(迷失在网络 (问题不解答扣分也不结贴!))回复于 2006-07-06 19:19:19 得分 0
我想单单把单引号过滤成双引号是不够的。
举个例子。某站点在indes.aspx?id=1处有注入漏洞。因为id是int类型。本生可能就没有单引号。 如果注入者 在1后面在加上; delete form admin ;--这么办?
我想过滤注入最重要的可能就是3个字符,单引号,分号和两个连续的--。当然还有他们对应的各种编码,不过编码没试过是否可以注入。比如有些数据库可能会有内置函数返回一个特定符号什么的。。
以上个人看法。希望指正。。Top
88 楼loverdotnet(西瓜)回复于 2006-07-06 22:17:17 得分 0
markTop
89 楼kubbye(小蛤蟆就是我)回复于 2006-07-06 23:23:01 得分 0
实现与数据库的分离就是了,
Top
90 楼phommy(石头,竹子,诗)回复于 2006-07-07 08:18:13 得分 0
boyyao(迷失在网络 (问题不解答扣分也不结贴!))
举个例子。某站点在indes.aspx?id=1处有注入漏洞。因为id是int类型。本生可能就没有单引号。 如果注入者 在1后面在加上; delete form admin ;--这么办?
我想过滤注入最重要的可能就是3个字符,单引号,分号和两个连续的--。当然还有他们对应的各种编码,不过编码没试过是否可以注入。比如有些数据库可能会有内置函数返回一个特定符号什么的。。
------------
看楼主的意思,是要防登录时的'or''='方式注入,不会涉及到int类型的问题;你提到的问题,可以通过类型转换解决。
--或者干脆在SQL里上引号,如果id=后面是数字的话会正常使用的。程序的健状性由try catch或defaultRedirect维护。
我目前所知sql server在做“=”比较时除了字符串中''转义成',没有任何转义符号所以后一个问题也可以放心~Top
91 楼Imain(imain)回复于 2006-07-07 08:19:15 得分 0
upTop
92 楼sunboyyq(yyq)回复于 2006-07-07 10:10:32 得分 0
还是这个问题火。同意:对于SQL,你只要转义一个字符就可以了 那就是把 '==>''
Top
93 楼johnzen(以速度突破生命)回复于 2006-07-07 10:21:31 得分 0
replace("'","")Top
94 楼seawhl(hallywang)回复于 2006-07-07 11:08:43 得分 0
java很容易解决这个问题Top
95 楼xiaozhimin1978(小灰狼)回复于 2006-07-17 11:51:55 得分 0
怎么这么多比我还菜的菜鸟啊
这种问题非常简单,居然引来了那么多人讨论来讨论去的,晕Top
96 楼job_2006(初学.net)回复于 2006-07-17 12:37:14 得分 0
感觉大家都比较关注SQL注入式攻击,呵
顶顶Top




