上一篇写的sql注入的基本原理,本来要接着写这篇的,但是由于时间的原因一直没有写成,今天是五一假期,总算是能抽空写写了。
作为一个程序员,防范sql注入的第一线是由我们来守护的,只要我们在程序中留少许的漏洞,就会给程序增强安全特性。所以我们要做的是要写安全的程序,防止sql注入在程序体现在不要拼接sql字符串,一定要参数化sql或者写存储过程,这里就说说简单的参数化sql吧。
例子中用c#和oracle实现,java中或者其他数据库中的实现也是类似的。
using System.Data.OracleClient;//引入oracle操作包
//定义DML语句
string strSQL = @"select user.name from user where user.name =:userName";
//上句中的:userName就是sql语句中参数的占位符,也就是说在数据库服务器中执行这条sql语句的时候这个占位符要被其他东西替换掉,到底用什么东西替换呢,接着往下看
OracleParameter[] param = {
new OracleParameter(":userName",txtName);
}//这里定义一个参数的数组,里面可以写入多个sql参数,咱们的这里只有一个,所以就写入一个参数,这里讲占位符和他的替换也就是参数值对应起来了,txtName就是占位符的替换值,他是用户界面中用户输入的值,就是他可能含有注入攻击的字符,这下数据库服务器知道用什么东西替换占位符了。
定义好sql语句和参数后就是执行了,执行的时候需要同时将sql语句和参数传入,这样用户输入的带有非法字符的字符串在数据库会当作参数处理,而不会当作sql语句和数据库自己的字符混乱,防止了注入攻击。
OracleCommandcmd = new OracleCommand();
cmd.CommandText= strSQL;//定义oracle命令的文本内容
for(oracleParameter p in param)//将参数传入
{
cmd.Parameters.Add(p);
}
cmd.ExecuteNonQuery();//执行命令
上面基本上是一个完整的参数化sql,不同的数据库服务器sql语句中参数的占位符不同,上面用的是oracle,参数占位符是冒号(:)加名字,在sqlserver中是用@符号加名字作为占位符,而在mysql中用问号(?)加名字来作为参数占位符,不同的数据库中参数的表示符号不一样,这个需要注意。