如何使用每个IP地址的PDO-connect防止反向DNS查找?

时间:2015-09-05 13:32:49

标签: php mysql pdo dns

我尝试通过PDO连接到每个IP地址的另一个数据库服务器(MySQL)。

$db = new PDO('mysql:host=IP-ADDRESS;dbname=AAA', 'USER', 'XXXXX');

我在这里伪造了IP地址和用户,这不是错误;)

但无论出于何种原因,PDO将进行一些疯狂的反向DNS查找并最终连接到完全不同的服务器,该服务器具有另一个IP地址和每个A记录分配的其他域,因为来自PDO的反向dns查找将找到这里。

PDO抛出特定的例外:

SQLSTATE[28000] [1045] Access denied for user 'USER'@'WWW.ANOTHER-SERVER.COM'

通过mysql-client连接终端时,一切都按预期工作。

  1. 如何避免PDO进行反向DNS查找?
  2. 我如何告诉PDO它应该按参数中给出的每个IP地址进行连接?
  3. 怎么可能,这种反向DNS查找是错误的?
  4. / etc / hosts中没有特定条目,这可能是其中的根本原因。

1 个答案:

答案 0 :(得分:4)

PHP / PDO机器:

PDO永远不会进行反向查询。它将进行正向查找,然后连接到该IP。

你应该能够看到,在PHP / PDO机器上运行

tcpdump -i ethsomething -n -s 1500 -xX port 3306

当PDO尝试连接时,此处显示的是哪个IP号码?

MySQL机器:

MySQL永远不会知道您尝试访问它的主机名是什么。服务器将看到传入的请求,在套接字上执行getpeername(),产生一个IP号。

默认情况下,服务器将对该IP进行反向查找。您可以通过添加

来关闭此功能
[mysqld]
skip-name-resolve

进入my.cnf文件并重新启动服务器。

当MySQL配置为进行反向查找时,它会尝试这样做。如果失败,则在服务器放弃之前等待DNS响应的连接尝试将花费5到30秒。

如果反向查找成功,MySQL将进入mysql.user表及其具有已解析名称的朋友,用户@ reverse_lookup_result。

如果反向查找失败,或者已使用skip-name-resolve禁用,MySQL将进入mysql.user表和未解析名称为user@1.2.3.4或类似的朋友。

这会产生有趣的后果:

  1. 启用名称解析后,用户可能拥有不同的权限,具体取决于反向查找的成功。

  2. 当skip-name-resolve打开时,mysql.user.host中不是ip-number的条目是无用的。