【问题标题】:How to prevent Reverse DNS Lookup with PDO-connect per IP-adress?如何防止使用每个 IP 地址的 PDO 连接进行反向 DNS 查找?
【发布时间】:2015-12-01 12:45:51
【问题描述】:

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

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

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

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

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 中没有特定的条目,这可能是造成这种情况的根本原因。

【问题讨论】:

  • 看来我也有同样的问题。接受的答案并没有真正说明它是如何修复的。你能解决它吗?

标签: php mysql pdo dns


【解决方案1】:

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 将进入 mysql.user 表和未解析名称 user@1.2.3.4 或类似名称的朋友。

这会产生有趣的后果:

  1. 启用名称解析后,根据反向查找的成功与否,用户可能拥有不同的权限。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-08
    • 2014-06-09
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2012-06-07
    相关资源
    最近更新 更多