SQL注入式攻击是指利用设计上的漏洞,在目标服务器上运行SQL命令以及进行其他方式的攻击,动态生成SQL语句时没有对用户输入的数据进行验证。SQL注入式攻击是一种常规性的攻击,可以允许一些不法用户检索他人的数据,改变服务器的设置,或者在他人不小心的时候破坏其服务器。SQL注入式攻击不是SQL Server问题,而是不适当的程序。
要防范SQL注入式攻击,应该注意以下几点。
(1)检查输入的SQL语句的内容,如果包含敏感字符,则删除敏感字符,敏感字符包括'、>、<=、!、-、+、*、/、()、|和空格等。
(2)不要在用户输入过程中构造WHERE子句,应该利用参数来使用存储过程。
说明:SQL注入一般出现在程序开发构造一个WHERE子句伴随着用户输入的时候。
在ASP.NET中可以自定义一个方法过滤非法字符,该方法如下:
以下是引用片段: /// <summary> /// 防止SQL 注入试攻击 /// </summary> /// <param name="inputString">用户输入字符串</param> public string ConvertSql(string inputString) { inputString = inputString.Trim(); inputString = inputString.Replace("'","''"); inputString = inputString.Replace(";--",""); inputString = inputString.Replace("=",""); inputString = inputString.Replace("or",""); inputString = inputString.Replace("and",""); return inputString; } |
使用以上方法在C#中不是最佳有效的途径,最佳途径是通过SqlCommand.Parameters 属性的参数传值实现,将非法字符过滤掉。主要代码如下。
以下是引用片段: myCommand.Parameters.Add(new SqlParameter("@loginName", SqlDbType.NVarChar, 20)); myCommand.Parameters["@loginName"].Value = loginName; myCommand.Parameters.Add(new SqlParameter("@loginPwd", SqlDbType.NVarChar, 20)); myCommand.Parameters["@loginPwd"].Value = loginPwd; |