$sql = "SELECT * FROM users WHERE id='{$_GET['user_id']}';"; $result = mysql_query($sql);
上述代码中,通过构造URL参数,黑客可以输入一段类似以下的代码:
?id=1;SELECT VERSION();
从而将原本的SQL语句修改成了以下命令行:
SELECT * FROM users WHERE id='1';SELECT VERSION();
这一命令将会执行两个SQL查询,其中第一个查询会返回用户的数据,而第二个查询会返回MySQL数据库的版本号,稍有常识的人士都可以通过这个漏洞,轻易地获取服务器的敏感信息。
更进一步,黑客还可以通过注入Shell来实现服务器的完全控制。一旦黑客成功地利用注入漏洞,获取到系统的shell,他们就可以利用这个Shell进一步扩大攻击面,比如在服务器上植入后门,掌控服务器的访问权限,执行敏感数据的提取,以及利用服务器作为外部网络中的跳板机进行攻击。
为了避免MySQL注入攻击,大家可以采取以下措施:
1.对输入的参数进行过滤,将特殊字符进行转义,例如将单引号转成双单引号,或者使用PHP内置函数mysql_escape_string()将参数转义。 2.禁止直接将URL参数用于构造SQL语句,而是通过存取参数的方式,将参数传递给函数或者对象,由函数或者对象进行SQL语句的构造。 3.升级MySQL版本,使用MySQL5以上版本,因为MySQL5以上版本的Magic Quotes功能可以有效地避免SQL注入攻击。 4.定期更新数据库的账户密码,为数据库的账户设置强密码,并且定期更换密码,及时更新数据库的补丁。