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

关于三层结构的问题
请问各位,如果项目弄成三层结构的话,那么如何防止SQL注入呢?
数据层一般都是固定的吧?也就是说:不用管什么SQL语句(分为查询和插入(更改)两种)用的都是一个方法,但是这样的话,如何来防止sql注入呢?
就是这样:
数据层:
public DataSet Select(string sSQL)
{
  SqlConnection con=new SqlConnection("连接字符串");//建立数据库连接
  SqlDataAdapter adr=new SqlDataAdapter(sSQL,con);
  DataSet ds=new DataSet();
  adr.Fill(ds);
  return(ds);
}
public int Execute(string sSQL)
{
  SqlConnection con=new SqlConnection("连接字符串");//建立数据库连接
  con.Open();
  SqlCommand cmd=new SqlCommand(sSQL,con);
  return cmd.ExecuteNonQuery();
}
然后在逻辑层,比如说添加一个员工(或者其他的所有的修改和增加的操作),就调用数据层的Execute(“写好的SQL语句作为参数传递”);而选择的话,就调用数据层的Select(“写好的SQL语句作为参数传递");
可是这样的话,请问大家,该如何防止SQL注入呢?不会是过滤危险字符吧?如果过滤的话,那一些技术类的文章可能就显示不出来了,而且,三层结构如何来进行原子性操作呢?



------解决方案--------------------
如果防范做得不好。你用 300 层就一样会中
------解决方案--------------------
考虑一下用存储过程或者使用参数吧,这样可以在一定程度上避免SQL注入。
------解决方案--------------------
屏蔽一些参数啊
------解决方案--------------------
同意楼上。
------解决方案--------------------
探讨
考虑一下用存储过程或者使用参数吧,这样可以在一定程度上避免SQL注入。

------解决方案--------------------
楼主不要急
等待高手
帮你顶个!!!
------解决方案--------------------
public DataSet Select(string sSQL) 

sSQL = sSQL.replace("'","");
SqlConnection con=new SqlConnection("连接字符串");//建立数据库连接 
SqlDataAdapter adr=new SqlDataAdapter(sSQL,con); 
DataSet ds=new DataSet(); 
adr.Fill(ds); 
return(ds); 

public int Execute(string sSQL) 

sSQL = sSQL.replace("'","");
SqlConnection con=new SqlConnection("连接字符串");//建立数据库连接 
con.Open(); 
SqlCommand cmd=new SqlCommand(sSQL,con); 
return cmd.ExecuteNonQuery(); 

哈哈,这样是不是就会好一点呢??
要不再加上过滤 --??

------解决方案--------------------
就拿你写的那两个方法来说 参数里面完全可以添加一个sql参数的数组啊 string完全可以传递存储过程的名字啊 这样的话方法也还是没有变化的 

况且 只传string和只返回影响行数的int值 在一些特定的sql操作中 是根本不能满足需要的 如果谁说 他的项目里面的数据操作的select就铁定只用一种方法了 那我估计他做不下去的!~
------解决方案--------------------
"这个就和一层的的一样了吧?"

我觉得你对分层的概念有误解
------解决方案--------------------
额..还有..数组是说顺嘴了 其实我的意思是提供一个sql参数的集合
------解决方案--------------------
关注!!!
帮你顶!!
一般我都是用存储过程!!
------解决方案--------------------
个人愚见:
如果能正确处理单引号问题,SQL注入问题应该就可以解决了。
解决办法:运用CommandParameter屏蔽:这个方法可以应对相当一部分SQL注入,但是倘若后台数据库中需要执行诸如EXEC @SQLString 的命令,那么还需要专门针对单引号作过滤(比如将一个单引号替换为两个单引号)
------解决方案--------------------
运用了CommandParameter,对于后台数据库来说应该可以屏蔽掉诸如delete,update,drop,truncate table等破坏性的攻击命令。
此外还需要合理运用异常处理可使程序更为健壮地运行,见笑了!!!
------解决方案--------------------
up
------解决方案--------------------
很奇怪,好象三层跟注入没联系吧,用参数化查询调用过滤函数的方法把传入参数过滤掉就行啦!
------解决方案--------------------