这种写法是不是无法避免sql注入?

xingshungames 2010-02-08 02:40:39

using System;
using System.Collections;
using System.Text;
using System.Data;
using Microsoft.ApplicationBlocks.Data;
using System.Data.SqlClient;

namespace ClothingCode
{
/// <summary>
/// 管理员后台对网站广告的添加和删除
/// </summary>
public class AD
{
/// <summary>
/// 添加广告
/// </summary>
/// <param name="c_AD">广告实体</param>
public void InsertAD(ClothingCode.ADEntity c_AD)
{
string sqlString = "insert into [C_AD](ADTitle,ADContent,ADType,ADPhoto,ADUrl)" +
"values(N'" + c_AD.ADTitle + "',N'" + c_AD.ADContent + "'," + c_AD.ADType + ",N'" + c_AD.ADPhoto + "',N'" + c_AD.ADUrl + "')";
object obj = SqlHelper.ExecuteNonQuery(ClothingCode.ClothingSystem.ConnString, CommandType.Text, sqlString);
}

/// <summary>
/// 删除广告
/// </summary>
/// <param name="c_AD">广告实体</param>
public void DeleteADAdmin(ClothingCode.ADEntity c_AD)
{
string sqlString = "delete from C_AD where ADID=" + c_AD.ADID + "";
SqlHelper.ExecuteNonQuery(ClothingCode.ClothingSystem.ConnString, CommandType.Text, sqlString);
}
}
}


如题,这种写法是不是和
select * from User where UserName='"+txtUserName+"' 属于同一种类型?都无法避免注入?
...全文
295 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
rjzou2006 2010-02-08
  • 打赏
  • 举报
回复
实体就有限定呢。祝 好运。
wuyq11 2010-02-08
  • 打赏
  • 举报
回复
定义实体类
使用对象属性
string sqlString = "insert into [C_AD](ADTitle) values(@ADTitle)";
mengjun5200 2010-02-08
  • 打赏
  • 举报
回复
引用 14 楼 kengqiangxianv 的回复:
C# codepublicstaticstring FilterVal(string Val)
{if (string.IsNullOrEmpty(Val))return"";string value= Val;//防SQL注入 value= value.Replace("'","");
value= value.Replace("--","");
value= value.Replace(";",";");//过滤JS和HTML value= value.Replace("&","&");
value= value.Replace("<","<");
value= value.Replace(">",">");
value= value.Replace("\"",""");
value= value.Replace("'","'");return value;
}
最好把你的sql语句写在存储过程里面,如果非要写在代码里面上面的方法可以帮你过滤掉某些特定字符。最后还是劝告写在存储过程里面。


这个可以
lsd123 2010-02-08
  • 打赏
  • 举报
回复
phoeni_xin 2010-02-08
  • 打赏
  • 举报
回复
引用 22 楼 guyehanxinlei 的回复:
用存储过程安全一点.
1.存储过程有执行计划,执行起来快速.
2.存储过程存储在服务器端,可以减少不必要的数据库脚本语句通过网络传递到服务器端执行.
3.修改起来可以不需要重新编译代码.


恩。学习了。
guyehanxinlei 2010-02-08
  • 打赏
  • 举报
回复
用存储过程安全一点.
1.存储过程有执行计划,执行起来快速.
2.存储过程存储在服务器端,可以减少不必要的数据库脚本语句通过网络传递到服务器端执行.
3.修改起来可以不需要重新编译代码.
xingshungames 2010-02-08
  • 打赏
  • 举报
回复
public void InsertAD(ClothingCode.ADEntity c_AD)
{
string sqlString = "insert into [C_AD](ADTitle,ADContent,ADType,ADPhoto,ADUrl)" +
"values(N@ADTitle,N@ADContent,@ADType,N@ADPhoto,N@ADUrl)";
SqlParameter sqlParamList = new sqlParamList[]
{
new SqlParameter("@ADTitle",c_AD.ADTitle),
new SqlParameter("@ADContent",c_AD.ADContent),
new SqlParameter("@ADType",c_AD.ADType),
new SqlParameter("@ADPhoto",c_AD.ADPhoto),
new SqlParameter("@ADUrl",c_AD.ADUrl)
};

object obj = SqlHelper.ExecuteNonQuery(ClothingCode.ClothingSystem.ConnString, CommandType.Text, sqlString,sqlParamList);
}
是不是改成这样就ok了?
jin225 2010-02-08
  • 打赏
  • 举报
回复
public void InsertAD(ClothingCode.ADEntity c_AD)
{
string sqlString = "insert into [C_AD](ADTitle,ADContent,ADType,ADPhoto,ADUrl)" +
"values(N'" + c_AD.ADTitle + "',N'" + c_AD.ADContent + "'," + c_AD.ADType + ",N'" + c_AD.ADPhoto + "',N'" + c_AD.ADUrl + "')";
object obj = SqlHelper.ExecuteNonQuery(ClothingCode.ClothingSystem.ConnString, CommandType.Text, sqlString);
}

加个N好像是编码的问题吧 如果服务器是英文的操作系统的,前面不加个N插入数据库的话 就会乱码
这样 好像不可以防注入的吧 ! 对方注入一点用处都没有
yang_5 2010-02-08
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
kele1006 2010-02-08
  • 打赏
  • 举报
回复
引用 3 楼 fangfangok 的回复:
1.使用存储过程.传递参数 sqlparameter[] sp={ new sqlparameter("@id",id)}
2.过滤敏感字符比如:' --  delete from 等等。可以写一个过滤的类  replace
  在需要过滤的地方直接调用。


Insert,Update,Delete,Query等都可以使用使用sqlparameter,您可以使用CodeSmith等工具直接生成
xiaoheixiaobai 2010-02-08
  • 打赏
  • 举报
回复
对于string sqlString = "delete from C_AD where ADID=" + c_AD.ADID + "";如果不采取措施避免注入,
假如,用户输入“ 0 or 1=1 ”,语句就变成了“delete from C_AD where ADID=0 or 1=1 ”,
假如,用户输入“ 0;drop C_AD;”语句就变成了“delete from C_AD where ADID=0;drop C_AD;”
那数据损失是很大的。
supersyd 2010-02-08
  • 打赏
  • 举报
回复
对传入的参数 编码即可。
swalp 2010-02-08
  • 打赏
  • 举报
回复
很难避免的,我自己做了一个试了一试,可以注入!
kengqiangxianv 2010-02-08
  • 打赏
  • 举报
回复
 public static string FilterVal(string Val)
{
if (string.IsNullOrEmpty(Val))
return "";
string value = Val;
//防SQL注入
value = value.Replace("'", "");
value = value.Replace("--", "");
value = value.Replace(";", ";");
//过滤JS和HTML
value = value.Replace("&", "&");
value = value.Replace("<", "<");
value = value.Replace(">", ">");
value = value.Replace("\"", """);
value = value.Replace("'", "'");
return value;
}

最好把你的sql语句写在存储过程里面,如果非要写在代码里面上面的方法可以帮你过滤掉某些特定字符。最后还是劝告写在存储过程里面。
mail_ricklee 2010-02-08
  • 打赏
  • 举报
回复
1.SqlParameter,OraclParameter
2.IBatisNet,NHibernate
3.Linq

参考FortuneBase
参考地址www.cnblogs.com/mail-ricklee
jingherong 2010-02-08
  • 打赏
  • 举报
回复
这中写法确实很容易注入的!
qq2013 2010-02-08
  • 打赏
  • 举报
回复
引用 9 楼 feiguohaixia 的回复:
用 SqlParameter 传参,或是用存储过程,这种方法用时限制字符长度,验证特殊字符,关键字,字符类型,但最好别用


ding
yinsummer 2010-02-08
  • 打赏
  • 举报
回复
应该用参数传递形式的
feiguohaixia 2010-02-08
  • 打赏
  • 举报
回复
用 SqlParameter 传参,或是用存储过程,这种方法用时限制字符长度,验证特殊字符,关键字,字符类型,但最好别用
随风落梦 2010-02-08
  • 打赏
  • 举报
回复
是非常容易被SQL注入的!
加载更多回复(7)

62,264

社区成员

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

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

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

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