0

这是我第二次注意到这个...

我在笔记本电脑上运行 Zend Framework 应用程序,但连接到我的远程数据库。它大部分时间都可以正常工作(在家和其他地方)。但这是我第二次从我的应用程序中收到错误消息:

SQLSTATE[28000] [1045] Access denied for user 'databaseuser'@'some.ip.address.here' (using password: YES) 

唯一改变的是我的无线网络连接。现在,此消息始终在此 wi-fi 连接上弹出,但一旦我在另一个连接上,我将不会收到此消息。但是,我注意到在生产服务器上运行应用程序并通过 wi-fi 访问它时也发生过一次。

这对我的申请意味着什么?我怎样才能防止这种情况发生?

4

1 回答 1

5

MySQL 权限通常授予每个用户客户端主机的每个 IP 地址(从数据库的角度来看,客户端是运行 PHP 应用程序的主机)。

您的 wi-fi 路由器可能正在使用 DHCP 为您的笔记本电脑分配 IP 地址,因此无法保证每次更新连接时它都会为您的笔记本电脑授予相同的地址。

我看到两种可能的补救措施:

  1. 一些路由器允许您将特定的 IP 地址与给定的 MAC 地址绑定,这样一台 PC 就可以可靠地获得相同的 IP 地址(这就是我在家庭网络上所做的)。

  2. 或者,您可以使用语句打开数据库服务器上的权限,GRANT以便路由器提供的 DHCP 地址范围内的任何 IP 地址都可以访问数据库。例子:

    GRANT ALL ON test.* TO 'databaseuser'@'192.168.1.%' IDENTIFIED BY 'databasepassword';
    

    但是,您不想授予对任何IP 地址的开放访问权限,因为这样更广泛的网络上的任何人都可能联系您的数据库服务器。


更新: 当然 192.168.1.% 是您在防火墙后面使用的内部子网。这只是一个示例,表明您可以对您在GRANT语句中提供的地址中的任何八位字节使用通配符。

如果您在家中连接,您的互联网提供商可能会分配一个外部 IP 地址,但这可能会经常更改,具体取决于他们的网络管理策略。您可以选择获取一个保证不会更改的静态 IP 地址,但这通常会花费更多。

当然,如果您从咖啡店或机场或其他任何地方连接,您的连接将显示为他们的外部 IP 地址。

当然,最灵活的做法是开放您的 MySQL 权限,以便来自任何 IP 地址的任何客户端都可以连接(假设他们知道用户名和密码)。但该计划的问题在于,来自任何 IP 地址的任何客户端都可以连接- 即即使不是您。

于 2009-12-21T00:44:39.427 回答