有人攻击了我的数据库 - 怎么样?

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_real_escape_string

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

  • 老兄很好地解释了.+1为您的解释和链接 (2认同)

Pau*_*xon 6

它看起来不像您粘贴的代码提供了合适的攻击.我调查这个的方法是扫描MySQL二进制日志中的相关DROP TABLE语句,给我一个时间戳.然后,您可以使用该时间戳查找可以与之关联的Apache请求.

然后,这只是一个仔细审核每个候选请求中的代码直到你钉它的情况:(