如果用户输入未经修改就插入到SQL查询中,则应用程序很容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
这是因为用户可以输入类似值的内容);DROP TABLE表;--,并且查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
可以采取什么措施防止这种情况发生?
PHP和MySQL有很多答案,但以下是针对PHP和Oracle的代码,用于防止SQL注入以及定期使用oci8驱动程序:
$conn = oci_connect($username, $password, $connection_string);
$stmt = oci_parse($conn, 'UPDATE table SET field = :xx WHERE ID = 123');
oci_bind_by_name($stmt, ':xx', $fieldval);
oci_execute($stmt);
有许多方法可以防止SQL注入和其他SQL攻击。你可以很容易地在互联网上找到它(谷歌搜索)。当然,PDO是一个很好的解决方案。但我想建议您一些防止SQL注入的良好链接。
什么是SQL注入以及如何防止
SQL注入PHP手册
Microsoft对PHP中SQL注入和预防的解释
还有一些类似于防止MySQL和PHP的SQL注入。
现在,为什么需要防止SQL注入查询?
我想告诉您:为什么我们要通过下面的一个简短示例来防止SQL注入:
查询登录身份验证匹配:
$query="select * from users where email='".$_POST['email']."' and password='".$_POST['password']."' ";
现在,如果有人(黑客)
$_POST['email']= admin@emali.com' OR '1=1
和密码。。。。
查询将被解析到系统中,直到:
$query="select * from users where email='admin@emali.com' OR '1=1';
另一部分将被丢弃。那么,会发生什么?未经授权的用户(黑客)可以以管理员身份登录,而无需密码。现在,他/她可以做管理员/电子邮件管理员可以做的任何事情。看,如果不阻止SQL注入,这是非常危险的。
一个好主意是使用像Idiorm这样的对象关系映射器:
$user = ORM::for_table('user')
->where_equal('username', 'j4mie')
->find_one();
$user->first_name = 'Jamie';
$user->save();
$tweets = ORM::for_table('tweet')
->select('tweet.*')
->join('user', array(
'user.id', '=', 'tweet.user_id'
))
->where_equal('user.username', 'j4mie')
->find_many();
foreach ($tweets as $tweet) {
echo $tweet->text;
}
它不仅可以避免SQL注入,还可以避免语法错误!它还支持具有方法链接的模型集合,以一次过滤或将操作应用于多个结果和多个连接。