如何使用PDO按IP地址防止反向DNS查找?

3

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

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

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

但出于某种原因,PDO将进行一些疯狂的反向DNS查找,最终连接到完全不同的服务器,该服务器具有另一个IP地址和其他域名,根据PDO执行的反向DNS查找所找到的A记录而指定。

PDO抛出特定的异常:

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

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

  1. 我如何避免PDO进行反向DNS查找?
  2. 我如何告诉PDO它应该根据参数连接IP地址?
  3. 为什么这个反向DNS查找是如此错误的呢?

/etc/hosts中没有特定的条目,可能是造成这种情况的根本原因。


看起来我遇到了同样的问题。被接受的答案并没有真正说明如何解决它。你能修复它吗? - AbstractVoid
1个回答

4

PHP/PDO 机器:

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

您应该能够看到,在 PHP/PDO 机器上作为 root 运行:

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将使用已解析的名称user@reverse_lookup_result进入mysql.user表及其相关数据。
如果反向查找失败或使用skip-name-resolve禁用,则MySQL将使用未解析的名称user@1.2.3.4或类似的方式进入mysql.user表及其相关数据。
这会产生有趣的后果:
1. 当name-resolve开启时,用户可能具有不同的权限,具体取决于反向查找的成功与否。 2. 当skip-name-resolve开启时,mysql.user.host中不是IP地址的条目是无用的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接