防止程序SQL语句错误以及SQL注入

本文介绍如何通过使用参数化查询和字符串处理技术来防止SQL注入攻击,并确保查询准确性。包括使用预处理语句和字符串替换方法,以及如何进行模糊查询。

为了防止程序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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值