首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

关于三层结构的有关问题

2012-01-15 
关于三层结构的问题请问各位,如果项目弄成三层结构的话,那么如何防止SQL注入呢?数据层一般都是固定的吧?也

关于三层结构的问题
请问各位,如果项目弄成三层结构的话,那么如何防止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
[解决办法]
很奇怪,好象三层跟注入没联系吧,用参数化查询调用过滤函数的方法把传入参数过滤掉就行啦!
------解决方案--------------------


学习! 分析的很透彻,正是我心中的迷惑!
[解决办法]
静态发布解决全部问题!~~xml+xsl
[解决办法]

C# code
//@name对应你存储过程中的参数名 SqlParameter[] par = new SqlParameter[1];        par[0] = new SqlParameter("@name", SqlDbType.VarChar, 20);        par[0].Value = use.name;        return dal.NonQuery("存储过程名", par);
[解决办法]
帮顶.
[解决办法]
楼主这样并没有起到一个分层的作用..跟直接调用sql是一样的.你这样做只是起到一个封装的作用.并不是实际意义上面的分层.

真正的三层中是不会传一个sql语句来作为参数的...而是传一个对像.
[解决办法]
过滤字符串是无法阻止sql注入的,测试以下代码

SQL code
create table tttest(id int)godeclare @s varchar(100)set @s= char(100)+char(114)+char(111)+char(112) + ' table tttest'exec(@s)select * from tttest
[解决办法]
1.一般UI层和业务层就不应该见到SQL语句
2.穿参可以传参数数组

你可以看看我昨天回的一个帖子的修改
http://topic.csdn.net/u/20080613/00/3b28acd0-e68e-4a01-9370-d437021133de.html

实际应用,也有可能使用的是IDataParameter
[解决办法]
探讨
"这个就和一层的的一样了吧?"

我觉得你对分层的概念有误解

[解决办法]
探讨
楼主这样并没有起到一个分层的作用..跟直接调用sql是一样的.你这样做只是起到一个封装的作用.并不是实际意义上面的分层.

真正的三层中是不会传一个sql语句来作为参数的...而是传一个对像.

[解决办法]
每个参数都要过滤的时候,你就弄个传递sqlparameter数组。在SQL层循环拆这个参数数组赋值的时候,就统一一个个过滤就可以了。不过感觉有些真的没必要过滤。这样做性能上感觉很浪费
[解决办法]
探讨
过滤字符串是无法阻止sql注入的,测试以下代码


SQL codecreate table tttest(id int)
go
declare @s varchar(100)
set @s= char(100)+char(114)+char(111)+char(112) + ' table tttest'
exec(@s)

select * from tttest

[解决办法]
测试'
[解决办法]
呵呵..

尽量不要拼接sql,就算在存储过程中也尽量少拼接.因为只要你拼接.就可能会有问题

对于sql的参数一定要参数化,更不能去拼接!
[解决办法]
探讨
C# code
//@name对应你存储过程中的参数名
SqlParameter[] par = new SqlParameter[1];
par[0] = new SqlParameter("@name", SqlDbType.VarChar, 20);
par[0].Value = use.name;
return dal.NonQuery("存储过程名", par);



存储过程传参数就这样传给数据层了啊

[解决办法]
分和不分都有道理!
[解决办法]
新建一个用户,不用sa呢?比如用sb

SQL code
CREATE LOGIN sb     WITH PASSWORD = '1234'; CREATE USER sb FOR LOGIN sb; grant select to sb;grant execute to sb;gocreate proc ptest asbegin    select * from aa    --delete from aaend
[解决办法]
下载个SQLHELPER看下就知道!
[解决办法]
也就是说:如果表1的数据和表2的数据必须同时删除,该怎么办呢? 
==
存储过程 + 事务 + 异常出来


都在数据库里处理
[解决办法]
这个确实不好说。与分层无关。呵呵。。。
[解决办法]

探讨
如果防范做得不好。你用 300 层就一样会中

[解决办法]
这是我写的一个初步过滤的
C# code
public String convertQuotationMarks(String oldString)        {            string newString = oldString;            while (oldString.IndexOf("'") >= 0)            {                newString = oldString.Replace("'", "’");                oldString = newString;            }            string sqlstr = "and|exec|insert|select|delete|update|count|--|char|master|drop|truncate|declare";            string[] anysqlstr = sqlstr.Split('|');            foreach (string ss in anysqlstr)            {                if (newString.IndexOf(ss) >= 0)                {                    newString = "NULL";                }            }            return newString;        }
[解决办法]
使用存储过程~~~
[解决办法]
决不用直接拼接的SQL,一般是用参数绑定,除非是一些固定的,我们已经写好的可信任的SQL语句,或者对于拼接好的SQL绝对的可以信息,如
select * from table where [id]=var
其中,var我们可以绝对信任是数字,不可能会有injetion问题。

热点排行