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

来源:互联网 发布:软件测试教程 编辑:程序博客网 时间:2024/06/08 05:33

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

 

原创粉丝点击