分层能防止注入攻击吗?

zzxap 2008-12-12 01:17:47

public void Add(tour.Model.cate model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into tbl_cate(");
strSql.Append("ciID,catename,refectoryname,refeaddress,refephone,catereason,hotrefectory,cateinfo,cateFID");
strSql.Append(")");
strSql.Append(" values (");
strSql.Append("" + model.ciID + ",");
strSql.Append("'" + model.catename + "',");
strSql.Append("'" + model.refectoryname + "',");
strSql.Append("'" + model.refeaddress + "',");
strSql.Append("'" + model.refephone + "',");
strSql.Append("'" + model.catereason + "',");
strSql.Append("'" + model.hotrefectory + "',");
strSql.Append("'" + model.cateinfo + "',");
strSql.Append("" + model.cateFID + "");
strSql.Append(")");
DbHelperSQL.ExecuteSql(strSql.ToString());
}






C# code
using System;
using System.Collections.Generic;
using System.Text;

namespace tour.Model
{
/// <summary>
/// 实体类cate 。(属性说明自动提取数据库字段的描述信息)
/// </summary>
public class cate
{
public cate()
{ }
#region Model
private int _cateid;
private int _ciid;
private string _catename;
private string _refectoryname;
private string _refeaddress;
private string _refephone;
private string _catereason;
private string _hotrefectory;
private string _cateinfo;
private int _catefid;
private string _catefile;
private DateTime _adddate;

/// <summary>
///
/// </summary>
public int cateID
{
set{ _cateid=value;}
get{return _cateid;}
}
/// <summary>
///
/// </summary>
public int ciID
{
set{ _ciid=value;}
get{return _ciid;}
}
/// <summary>
///
/// </summary>
public string catename
{
set{ _catename=value;}
get{return _catename;}
}
/// <summary>
///
/// </summary>
public string refectoryname
{
set{ _refectoryname=value;}
get{return _refectoryname;}
}
/// <summary>
///
/// </summary>
public string refeaddress
{
set{ _refeaddress=value;}
get{return _refeaddress;}
}
/// <summary>
///
/// </summary>
public string refephone
{
set{ _refephone=value;}
get{return _refephone;}
}
/// <summary>
///
/// </summary>
public string catereason
{
set{ _catereason=value;}
get{return _catereason;}
}
/// <summary>
///
/// </summary>
public string hotrefectory
{
set{ _hotrefectory=value;}
get{return _hotrefectory;}
}
/// <summary>
///
/// </summary>
public string cateinfo
{
set{ _cateinfo=value;}
get{return _cateinfo;}
}
/// <summary>
///
/// </summary>
public int cateFID
{
set{ _catefid=value;}
get{return _catefid;}
}
/// <summary>
///
/// </summary>
public string catefile
{
set{ _catefile=value;}
get{return _catefile;}
}
/// <summary>
///
/// </summary>
public DateTime adddate
{
set{ _adddate=value;}
get{return _adddate;}
}
#endregion Model
}
}




...全文
159 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuStanly 2008-12-12
  • 打赏
  • 举报
回复
三年前就基本使用存储过程了。
mengxj85 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vrhero 的回复:]
引用 5 楼 c11_11_11 的回复:
分层和注入攻击 没有任何联系

引进流水化生产线能防止小偷到工厂里偷东西吗?风马牛不相及的问题...
[/Quote]
经典
zzxap 2008-12-12
  • 打赏
  • 举报
回复
strSql.Append("'" + model.catename + "',");
这个代码,如果catename属性值中含有单引号怎么办?这是一个连SQL语法都不懂的程序员写的SQL表达式。


为什么这样说?不合语法吗?


  • 打赏
  • 举报
回复
“过滤”什么呢?

过滤单引号,--符号,select单词,等等?

谁说model这个参数的属性中就不允许有这些字符呢?是跟用户签订协议了吗?当你写程序的时候你说“用户登录名中不允许含有=号”的时候,你仍然要区分这是你的个人的想象还是用户业务要求。如果你的技术可以做到录入某些符号,就不要硬往业务上找理由。
gpogpo 2008-12-12
  • 打赏
  • 举报
回复
有一定的帮助,但是数据的处理一定要在逻辑成中完成
  • 打赏
  • 举报
回复
你这个代码连基本的T-SQL都不合。

            strSql.Append("'" + model.catename + "',");


这个代码,如果catename属性值中含有单引号怎么办?这是一个连SQL语法都不懂的程序员写的SQL表达式。

另外,既然封装为
public void Add(tour.Model.cate model)

这样一个独立的方法,那么它就肯定将来要多处使用,那么写这个方法的人按说就不应该用“现在catename中不可能有单引号呀”这样的借口。

对于下面的几个字符串,也是一样,为什么不将单引号转换为两个单引号(这是T-SQL语法明文规定的)?

而如果你写的SQL表达式确实是符合SQL语法的,管它什么“注入”,那不是杞人忧天嘛!
niitnanfeng 2008-12-12
  • 打赏
  • 举报
回复
用存储过程传参数。
ilmarezhou 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 demei_net 的回复:]
分层并不能防注入攻击

最好是通过参数的方式进行防注入

如:
OracleParameter[] parms = {
new OracleParameter(":ID", OracleType.VarChar, 40), }

parms[0].Vlaue="";
[/Quote]
正确....
sxu_nono 2008-12-12
  • 打赏
  • 举报
回复
参数查询!都这么多年了……
sportdog 2008-12-12
  • 打赏
  • 举报
回复
这样写,注入问题仍然存在。

你还是老老实实传参数进取吧。
Bodil 2008-12-12
  • 打赏
  • 举报
回复
参数参数
weilu0328 2008-12-12
  • 打赏
  • 举报
回复
防止SQL注入还是要用Parameters来传值,分层跟SQL注入好像关系不那么密切;
zlb789 2008-12-12
  • 打赏
  • 举报
回复
建议过滤用户输入 对' -- master 等直接过滤
Trice_Xie 2008-12-12
  • 打赏
  • 举报
回复
用传参数和加一些验证.例如用户名不能含"'" ,"="
你给出的代码是肯定防止不了SQL注入的.
wengyuli 2008-12-12
  • 打赏
  • 举报
回复
这样说吧,参数传递在分层的系统中不过是参数走的的远一点而已,本身不会被过滤。
建议想防止注入,加入一些验证机制。
ttg520 2008-12-12
  • 打赏
  • 举报
回复
顶 参数化
justxd 2008-12-12
  • 打赏
  • 举报
回复



public void Add(tour.Model.cate model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into tbl_cate(");
strSql.Append ("ciID,catename,refectoryname,refeaddress,refephone,catereason,hotrefectory,cateinfo,cateFID");
strSql.Append(")");
strSql.Append(" values (@ciID,@catename,@refectoryname,@refeaddress,@refephone,@catereason,@hotrefectory,@cateinfo,@cateFID)");
//DbHelperSQL.ExecuteSql(strSql.ToString());
}


用参数
SmallWhiter 2008-12-12
  • 打赏
  • 举报
回复
可以建一规则层,过滤从客户端发过来的参数
一般使用存储过程可以防sql注入。
个人观点如有错误请大大们指出。
德者 2008-12-12
  • 打赏
  • 举报
回复
分层并不能防注入攻击

最好是通过参数的方式进行防注入

如:
OracleParameter[] parms = {
new OracleParameter(":ID", OracleType.VarChar, 40), }

parms[0].Vlaue="";
一品梅 2008-12-12
  • 打赏
  • 举报
回复
分层是松耦合,更好地服务于业务的灵活性与复用性。
加载更多回复(6)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧