请问各位,如果项目弄成三层结构的话,那么如何防止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注入呢?不会是过滤危险字符吧?如果过滤的话,那一些技术类的文章可能就显示不出来了,而且,三层结构如何来进行原子性操作呢?
数据层一般都是固定的吧?也就是说:不用管什么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注入呢?不会是过滤危险字符吧?如果过滤的话,那一些技术类的文章可能就显示不出来了,而且,三层结构如何来进行原子性操作呢?
解决方案 »
- 请问在VS2008中如何设置水晶报表工具栏的宽度?
- oracle真的比SQL SERVER强很多吗?
- 分割字符串
- Ajax readyState值 结果输出为 1 2 3 4 1 是怎么回事?
- cooke怎么用?
- 服务器控件调用js!!!!
- 问一个关于FORMS验证的问题!
- 该如何提供VS2005的编译速度??
- 关于使用Jmail组件发邮件的问题(请高手指教)
- <input id="btn1" type="button" runat="server">的服务器端代码没有相应
- DropDownList 绑定问题
- ★★★★★紧急提问,用System.IO.Compression.GZipStream压缩的文件winrar能够打开吗?
我知道用参数和存储过程可以防止SQL注入,但是用参数的话,每个SQL所带的参数是不一样的,那么不会把每个语句在分开对待处理吧?那样的话,我觉得这底层的数据层就没太大的意义了。
请高手支招。
我知道用参数和存储过程可以防止SQL注入,但是用参数的话,每个SQL所带的参数是不一样的,那么不会把每个语句在分开对待处理吧?那样的话,我觉得这底层的数据层就没太大的意义了。
请高手支招。
{
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完全可以传递存储过程的名字啊
=============
这个就和一层的的一样了吧?传存储过程名不还是要给他传参数吗?
或许我和你理解的不一样?
如果能正确处理单引号问题,SQL注入问题应该就可以解决了。
解决办法:运用CommandParameter屏蔽:这个方法可以应对相当一部分SQL注入,但是倘若后台数据库中需要执行诸如EXEC @SQLString 的命令,那么还需要专门针对单引号作过滤(比如将一个单引号替换为两个单引号)
此外还需要合理运用异常处理可使程序更为健壮地运行,见笑了!!!
//@name对应你存储过程中的参数名
SqlParameter[] par = new SqlParameter[1];
par[0] = new SqlParameter("@name", SqlDbType.VarChar, 20);
par[0].Value = use.name;
return dal.NonQuery("存储过程名", par);存储过程传参数就这样传给数据层了啊
go
declare @s varchar(100)
set @s= char(100)+char(114)+char(111)+char(112) + ' table tttest'
exec(@s)select * from tttest
2.穿参可以传参数数组你可以看看我昨天回的一个帖子的修改
http://topic.csdn.net/u/20080613/00/3b28acd0-e68e-4a01-9370-d437021133de.html实际应用,也有可能使用的是IDataParameter
=======
业务层也不见到SQL语句吗?可是那样的话,这数据层岂不是就很麻烦了吗?
能详细的解释一下吗?最好是给个例子,谢谢了。我看看您给的那个链接啊!
暂且先这样吧,只是这个数据的原子性操作,该怎么办呢?
也就是说:如果表1的数据和表2的数据必须同时删除,该怎么办呢?
请指教!
传了对象最后怎么跟数据库进行交互的??照你的说法分了层就不用sql了??你数据层里面写的都是啥???
太吓人了。竟然把tttest表删掉了。
WITH PASSWORD = '1234';
CREATE USER sb FOR LOGIN sb;
grant select to sb;
grant execute to sb;go
create proc ptest as
begin
select * from aa
--delete from aa
end 这样就只能用select语句,或者存储过程了,直接运行delete之类的就会报错
{
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; }
select * from table where [id]=var
其中,var我们可以绝对信任是数字,不可能会有injetion问题。