关于三层结构的问题
请问各位,如果项目弄成三层结构的话,那么如何防止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注入。
[解决办法]
屏蔽一些参数啊
[解决办法]
同意楼上。
[解决办法]
//@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注入的,测试以下代码
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
[解决办法]
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的数据必须同时删除,该怎么办呢?
==
存储过程 + 事务 + 异常出来
都在数据库里处理
[解决办法]
这个确实不好说。与分层无关。呵呵。。。
[解决办法]
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问题。