看了很多写防注入代码 而且是一大堆很多都是判断有没有 SQL关键字
我认为 不必如此麻烦
第一条
string str = str.Replace("'","");
理由是任何 SQL 语句都变成了 在两个单引号之间的字符串第二条
在纯数字查询语句下 如:select * from tb where id=?
在这 种情况下 判断是不是数字就可以了 是数字就查询,非数字就给个0以上是在 没有使用存储过程下 比较简单的两条语句了欢迎高手 拍砖
我认为 不必如此麻烦
第一条
string str = str.Replace("'","");
理由是任何 SQL 语句都变成了 在两个单引号之间的字符串第二条
在纯数字查询语句下 如:select * from tb where id=?
在这 种情况下 判断是不是数字就可以了 是数字就查询,非数字就给个0以上是在 没有使用存储过程下 比较简单的两条语句了欢迎高手 拍砖
解决方案 »
- c# Form webBrowser1 保存问题
- 求教~C# 委托
- 如何实现多站数据自动分配
- 我的C#代码中为什么using System.Management 有错?
- DataGridView 绑定一数据源,添加一数据,但随后取消更新,但在DataGridView中的那行还是显示着。
- DatagridView 排序
- 请教,做一个cs,用来定时访问一个网站!
- 请教一个关于以一个List集合为类属性时,get、set设置问题
- 请问大家一个问题:在C#中如何使用ADO.net?
- 把listbox里的資料添加到數據庫中
- c#代码转vb代码
- ==========C# 捕捉打开的IE=============顶者有分,谢谢
@"(?<='[\s\w]*)'(?=[\s\w]*')"
参数操作
where id=@id";
一个真正学过t-sql的人应该记住如何在字符常量中写单引号的“规矩”的!string str = str.Replace("'","''");
首先如果真的按照t-sql语法来写代码,知道要把单引号处理掉才能去拼凑sql语句字符串,那么也就没有那么多很夸张的所谓“防注入噱头”了。
“非数字”给个0是不对的,应该抛出异常。界面层跟业务处理层之间,应该传递强类型的数据,而不是滥用object或者string类型。如果类型不对,按照异常处理,而不应该再花费时间去查询数据库。
去掉sql语句中的单引号、空格和特殊符号
因为看到很多 防注入代码 都以 判断是否存在SQL关键字 而判断为非法操作
觉得不能保存更完整的内容第一
现在把 单引号 替换为 双单引号 就保存了更完整的内容 包括 单引号
一开始是觉得 单引号 会分开 sql 语句
现在转 换成 双单引号 转义了 就没事了
string str = str.Replace("'","''");第二
使用强类型在非参数化和不使用存储过程下,有以上两个做法应该够了,没有什么方法可以注入了,
如果有,贴出来,让我们这些新手们见识见识。第三
使用参数化第四
使用存储过程我想大家都推荐使用 后面两种方法吧,其实我也是
SET @InputStr = N'aa;DELETE FROM tb;';
DECLARE @_SqlMain NVARCHAR(4000);
DECLARE @_ParamsDef NVARCHAR(1000);
SET @_SqlMain =N'SELECT * FROM tb WHERE [Name] = @InputStr;';
SET @_ParamsDef = N'@_InputStr NVARCHAR(50)';
EXECUTE SP_EXECUTESQL @_SqlMain,@_ParamsDef,@InputStr;
使用 sp_executesql:
http://msdn.microsoft.com/zh-cn/library/ms175170.aspx
SQL 注入:
http://msdn.microsoft.com/zh-cn/library/ms161953.aspx