xRo*_*bot 32 php mysql sql-injection
有人攻击了我的数据库并放弃了该表.
在我的PHP页面中有一个单独的查询,我在使用mysql_real_escape_string:
$db_host="sql2.netsons.com";
$db_name="xxx";
$username="xxx";
$password="xxx";
$db_con=mysql_connect($db_host,$username,$password);
$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);
mysql_set_charset('utf8',$db_con);
$email= mysql_real_escape_string($_POST['email']);
$name= mysql_real_escape_string($_POST['name']);
$sex= mysql_real_escape_string($_POST['sex']);
if($_POST['M']!=""){ $sim = 1; }else { $sim = 0; }
$query = "INSERT INTO `users` (`email`, `name`, `sex`, `M`) VALUES
( '".$email."', '".ucwords(strtolower($name))."', '".$sex."','".$sim."')";
$res = mysql_query($query) or die("Query fail: " . mysql_error() );
mysql_close($db_con);
Run Code Online (Sandbox Code Playgroud)
而register_globals被禁用.
那么,我的数据库是怎么被黑了的?
ajr*_*eal 67
MySQL连接.如果未指定链接标识符,则假定mysql_connect()打开的最后一个链接.如果没有找到这样的链接,它将尝试创建一个,就好像没有参数调用mysql_connect()一样.如果未找到或建立连接,则会生成E_WARNING级别错误.
这里解释一下:mysql_real_escape_string()是否完全防止SQL注入?
根据您的代码段,您已连接数据库两次.
$db_con=mysql_connect($db_host,$username,$password);
$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);
mysql_set_charset('utf8',$db_con);
Run Code Online (Sandbox Code Playgroud)
并且您没有提供以下数据库链接标识符:
$email= mysql_real_escape_string($_POST['email']);
$name= mysql_real_escape_string($_POST['name']);
$sex= mysql_real_escape_string($_POST['sex']);
Run Code Online (Sandbox Code Playgroud)
因此,mysql_set_charset对$_POST为多字节字符提供的实际转义没有影响.
建议
mysql_connect($db_host,$username,$password);$db_con这样做时明确添加mysql_real_escape_string它看起来不像您粘贴的代码提供了合适的攻击.我调查这个的方法是扫描MySQL二进制日志中的相关DROP TABLE语句,给我一个时间戳.然后,您可以使用该时间戳查找可以与之关联的Apache请求.
然后,这只是一个仔细审核每个候选请求中的代码直到你钉它的情况:(