SQL注入及预防
SQL注入原理
以往Web应用程序访问数据库时一般是采取拼接字符串的形式,比如登录的时候就是根据用户名和密码去查询:
string sql = "select * from user where UserName = ‘” + userName + “’ and Password = ‘” + password + “’”;
"select * from user where UserName = ‘user’ and Password = ‘’ or ‘’ = ‘’;
select * from user where sex=@sexinsert into user(c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)
update user set c1 = ?, c2 = ?, c3 = ? where c4 = ?
update user set c1 = ?c1, c2 = ?c2, c3 = ?c3 where c4 = ?c4
select * from user where sex=1
select * from user where sex=@sex
select * from user where sex=@sex and age>@age
//实例化Connection对象SqlConnection connect =newSqlConnection("server=localhost;database=test;uid=root;pwd=''");//实例化Command对象SqlCommand command =newSqlCommand("select * from user where sex=@sex and age>@age", connect);//第一种添加查询参数的例子 command.Parameters.AddWithValue("@sex",true);//第二种添加查询参数的例子 SqlParameter parameter =newSqlParameter("@age", SqlDbType.Int);//User表age字段是int型parameter.Value = 30; command.Parameters.Add(parameter);//添加参数//将查询结果集以DataTable的方式返回//实例化DataAdapterSqlDataAdapter adapter =newSqlDataAdapter(command); DataTable data =newDataTable();
$sex = ‘男’;$age = ‘27’;$query = sprintf("select * from user where sex='%s' and age>'%d'",mysql_real_escape_string($sex),mysql_real_escape_string($age));mysql_query($query);或者:$db = new mysqli("localhost", "user", "pass", "database");$stmt = $mysqli -> prepare("select * from user where sex=? and age>?");$stmt -> bind_param("sd", $sex, $age);$sex = ‘男’;$age = ‘27’;$stmt -> execute();
PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE USERNAME=? AND PASSWORD=?");prep.setString(1, username);prep.setString(2, password);