日期:2014-05-18  浏览次数:20447 次

asp.net有没有sql注入的问题
有没有专门的程序防蛀

------解决方案--------------------
有,一般可以放到globla.asax文件中就可以写防注入的东西
------解决方案--------------------
防注入跟是不是ASP。NET没关系的 并且也不可能说谁直接提供 那是自己编码的问题 如果你直接用SQL语句 不用参数 那么就存在
------解决方案--------------------
lz应该没有见过sql语句注入的实例。
只要你不规范的使用sql语句就会出现sql注入问题。

尽量使用带参数的sql语句,存储过程 就可以防止注入问题
认真读一下的例子,就明白了

关于身份验证
sql= "select * from user where name= ' "&name& " ' and pwd= ' "&pwd& " ' "
假设只知道用户名不知道密码:
(1)我们在用户名位置输入【admin ' or 1= '1】。注:内容只有【】内的。
看看sql会变成什么:

sql=select * from user where name= 'admin ' or 1= '1 ' and pwd= '11 '
我们知道,or是一个逻辑运算符,在判断多个条件的时候,只要前一个等式成立,即name= 'admin '正确,整个等式就返回真,后面的and就不再进行判断了,也就是说我们绕过了密码验证,只要我们知道用户名就可以登陆该系统。
(2)我们也可以在用户名位置输入【admin ' --】。再看看sql:
以下内容为程序代码:
sql=select * from user where name= 'admin ' -- ' and pasword= '11 '
------解决方案--------------------
能不能防sql注入和编程语言无关
在asp.net里面,可以别用字符串拼接的方法
使用查询参数Parameter可以有效防治sql注入
------解决方案--------------------
既然楼主懒得看注入原理,那么直接告诉楼主方法就好了:
用参数做SQL语句
SqlConnection connection = new SqlConnection(连接字符串);
SqlCommand cmd = new SqlCommand( "select * from 表 where 条件1=@条件1,条件2=@条件2 ",connection);
SqlParameter[] para=new SqlParameter[]{
new SqlParameter( "条件1 ",SqlDbType.数据类型,数据长度),
new SqlParameter( "条件2 ",SqlDbType.数据类型,数据长度),
};
para[0].value=条件1的值;
para[1].value=条件2的值;
cmd.Parameters.Add(para[0]);
cmd.Parameters.Add(para[1]);
SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
cmd.Dispose();
这里别把connection关闭了,不然DataReader用不了,等DataReader用完了一定要记得关闭,不然会泄露连接池