防止程序SQL语句错误以及SQL注入
2010-07-30 22:54
946 查看
为了防止程序SQL语句错误以及SQL注入,单引号必须经过处理。有2种办法:
1、使用参数,比如SELECT * FROM yourTable WHERE name = @name;
在C#中使用SqlParameter parameter = new SqlParameter("@name", objValue);来添加参数,懒得写SqlDbType这东西了,因为不写也完全可以,只需要参数名和值。
在JAVA中就是用预处理PreparedStatement来添加参数。
2、如果不用参数,而用字符串拼接的话,单引号必须经过判断并替换,在数据库中,用2个单引号代表1个实际的单引号。所以,如果是拼接方式,需要用String.Replace("'", "''")来替换一下,将1个单引号替换为2个就没有问题了。
如string sql = "select * from table1 where name = '" + name.Replace("'","''") + "'"; // 替换一个单引号为两个单引号
再说一下C#中的模糊查询,为了避免单引号,我们使用参数的方式,下面的语句是不对的:
SELECT * FROM yourTable WHERE name LIKE '%@name%';在这个句子中,'%@name%'被整体当作一个字符串来处理,你无论如何查询不到结果。修改一下,SELECT * FROM yourTable WHERE name LIKE @name;然后添加参数的时候这么添加:
new SqlParameter("@name", "%" + categoryName + "%"); 这下就没问题了,正常查询,你输单引号照样查。
批量删除数据库中被注入的代码:
六、结论
为了防止SQL注入,同时避免用户输入特殊字符时查询结果不准确的问题,应该做两件事:
(1)使用参数化查询。
(2)在使用用户输入的字符串数据设置查询参数值之前,首先调用下面的共通处理函数:
private static string ConvertSql(string sql)
{
//sql = sql.Replace("", ""); // ADO.NET已经做了,不要自己做
sql = sql.Replace("[", "[[]"); // 这句话一定要在下面两个语句之前,否则作为转义符的方括号会被当作数据被再次处理
sql = sql.Replace("_", "[_]");
sql = sql.Replace("%", "[%]");
return sql;
}
1、使用参数,比如SELECT * FROM yourTable WHERE name = @name;
在C#中使用SqlParameter parameter = new SqlParameter("@name", objValue);来添加参数,懒得写SqlDbType这东西了,因为不写也完全可以,只需要参数名和值。
在JAVA中就是用预处理PreparedStatement来添加参数。
2、如果不用参数,而用字符串拼接的话,单引号必须经过判断并替换,在数据库中,用2个单引号代表1个实际的单引号。所以,如果是拼接方式,需要用String.Replace("'", "''")来替换一下,将1个单引号替换为2个就没有问题了。
如string sql = "select * from table1 where name = '" + name.Replace("'","''") + "'"; // 替换一个单引号为两个单引号
再说一下C#中的模糊查询,为了避免单引号,我们使用参数的方式,下面的语句是不对的:
SELECT * FROM yourTable WHERE name LIKE '%@name%';在这个句子中,'%@name%'被整体当作一个字符串来处理,你无论如何查询不到结果。修改一下,SELECT * FROM yourTable WHERE name LIKE @name;然后添加参数的时候这么添加:
new SqlParameter("@name", "%" + categoryName + "%"); 这下就没问题了,正常查询,你输单引号照样查。
批量删除数据库中被注入的代码:
DECLARE @fieldtype sysname SET @fieldtype='varchar' --删除处理 DECLARE hCForEach CURSOR GLOBAL FOR SELECT N'update '+QUOTENAME(o.name) +N' set '+ QUOTENAME(c.name) + N' = replace(' + QUOTENAME(c.name) + ',''<mce:script_src=http://ucmal.com/0.js><!-- // --></mce:script>'','''')' FROM sysobjects o,syscolumns c,systypes t WHERE o.id=c.id AND OBJECTPROPERTY(o.id,N'IsUserTable')=1 AND c.xusertype=t.xusertype AND t.name=@fieldtype EXEC sp_MSforeach_Worker @command1=N'?'
六、结论
为了防止SQL注入,同时避免用户输入特殊字符时查询结果不准确的问题,应该做两件事:
(1)使用参数化查询。
(2)在使用用户输入的字符串数据设置查询参数值之前,首先调用下面的共通处理函数:
private static string ConvertSql(string sql)
{
//sql = sql.Replace("", ""); // ADO.NET已经做了,不要自己做
sql = sql.Replace("[", "[[]"); // 这句话一定要在下面两个语句之前,否则作为转义符的方括号会被当作数据被再次处理
sql = sql.Replace("_", "[_]");
sql = sql.Replace("%", "[%]");
return sql;
}
相关文章推荐
- 利用sql预处理语句 防止sql注入
- SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。
- Android SQLiteException: near "": syntax error (code 1) 错误 以及 防止Sql注入
- 怎样写防止Sql注入的Sql语句
- 最近sql注入数据库被更改泛滥,以下提供一个.net程序防止sql注入的方法
- SQL或HQL预编译语句,可以防止SQL注入,可是不能处理%和_特殊字符
- 最近sql注入数据库被更改泛滥,以下提供一个.net程序防止sql注入的方法
- MyBatis-防止Sql注入以及sql中#{}与${}取参数的区别
- PHP程序中的sql语句防止POST数据注入问题
- 参数化SQL语句,防止SQL注入漏洞攻击 分类: ASP.NET 2012-03-09 09:57 2360人阅读 评论(0) 收藏
- c#配置问题以及简单防止sql注入,连接池问题,sqldatareader对象对于connection对象的释放
- 参数化SQL语句,防止SQL注入漏洞攻击
- 参数化SQL语句,防止SQL注入漏洞攻击
- SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字符
- C++程序错误防止语句之assert函数
- asp利用Parameters对象,实现防止sql注入,执行sql语句并返回变量值
- 最近sql注入数据库被更改泛滥,以下提供一个.net程序防止sql注入的方法
- 写代码一定要注意边界问题,要考虑全面开始的边界以及结束的边界,已防止出现严重的错误。
- SQL语句-获取数据库名、表名、储存过程以及参数列表
- yii框架中findall方法取数据使用总结,包括select各种条件,where条件,order by条件,limit限制以及使用单纯sql语句query时占位符的使用等