1.什么是SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.
2.如何防止SQL注入
防止SQL注入的方法有两种:
a.把所有的SQL语句都存放在存储过程中,这样不但可以避免SQL注入,还能提高一些性能,并且存储过程可以由专门的数据库管理员(DBA)编写和集中管理,不过这种做法有时候针对相同的几个表有不同条件的查询,SQL语句可能不同,这样就会编写大量的存储过程。
b.使用参数化SQL查询语句。
3.为什么参数化SQL查询可以防止SQL注入
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行。 有部份的开发人员可能会认为使用参数化查询,会让程序更不好维护,或者在实现部份功能上会非常不便,然而,使用参数化查询造成的额外开发成本,通常都远低于因为SQL注入攻击漏洞被发现而遭受攻击,所造成的重大损失。
4.如何写参数化的SQL查询语句(C#语句 SqlServer数据库)
在撰写 SQL 指令时,利用参数来代表需要填入的数值
Microsoft SQL Server 的参数格式是以 "@" 字符加上参数名称而成,如下:
SELECT * FROM myTable WHERE myID = @myID
INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)
例子1:
普通的Sql语句:
string idParam="001";
string querySql = "select count from [test] where id=‘"+idParam+"‘";
SqlCommand com = new SqlCommand(querySql, conn);
参数化的Sql语句:
string querySql = "select count from [test] where [email protected]";
SqlCommand com = new SqlCommand(querySql, conn);
com.Parameters.AddWithValue("@id", idParam);
例子2:
普通的Sql语句:
string updateSql= "insert into [test] (id,count,datetime) values (‘" + idParam + "‘,‘" + countParam+ "‘,‘" + System.DateTime.Now.ToString() + "‘)";
SqlCommand com = new SqlCommand(updateSql, conn);
参数化的Sql语句:
updateSql = "insert into [test] (id,count,datetime) values (@id,@count,@datetime)";
updateComm = new SqlCommand(updateSql, conn);
updateComm.Parameters.AddWithValue("@id", idParam );
updateComm.Parameters.AddWithValue("@count", countParam);
updateComm.Parameters.AddWithValue("@datetime", System.DateTime.Now.ToString());