Это второй раз, когда я заметил это...
Я запускаю приложение Zend Framework на своем ноутбуке, но подключился к моей удаленной базе данных. Он отлично работает в большинстве случаев (из дома и других мест). Но это второй раз, когда я получаю сообщение об ошибке из своего приложения:
SQLSTATE[28000] [1045] Access denied for user 'databaseuser'@'some.ip.address.here' (using password: YES)
Единственное, что изменилось, это мое соединение wi-fi. Теперь это сообщение постоянно появляется в этом соединении wi-fi, но как только я нахожусь на другом, я не получу это сообщение. Тем не менее, я заметил, что это также произошло однажды при запуске приложения на рабочем сервере и доступе к нему через Wi-Fi.
Что это значит для моего приложения? Как я могу предотвратить это?
Обычно для пользователей и IP-адресов хоста клиента часто предоставляются привилегии MySQL (клиент с точки зрения базы данных является хостом, на котором работает ваше приложение PHP).
Ваш Wi-Fi-маршрутизатор, вероятно, распределяет IP-адрес вашего ноутбука с помощью DHCP, поэтому нет гарантии, что он предоставит тот же адрес вашему ноутбуку каждый раз, когда он возобновит соединение.
Я вижу два возможных средства:
Некоторые маршрутизаторы позволяют связать определенный IP-адрес с заданным MAC-адресом, чтобы один ПК мог надежно получить тот же IP-адрес (это то, что я делаю в своей домашней сети).
Или вы можете открыть привилегии на вашем сервере базы данных с помощью GRANT
, чтобы любой IP-адрес в пределах диапазона Адреса DHCP, обслуживаемые вашим маршрутизатором, могут обращаться к базе данных. Пример:
GRANT ALL ON test.* TO 'databaseuser'@'192.168.1.%' IDENTIFIED BY 'databasepassword';
Однако вы не хотите предоставить открытый доступ к любому IP-адресу, потому что тогда кто-либо из более широкой сети может потенциально связаться с вашим сервером базы данных.
update: Конечно, 192.168.1.% - это внутренняя подсеть, которую вы используете за брандмауэром. Это всего лишь пример, показывающий, что вы можете использовать подстановочные знаки для любого октета в адресе, который вы указываете в инструкции GRANT
.
Если вы подключаетесь из дома, у вас, вероятно, есть один внешний IP-адрес, который назначается вашим интернет-провайдером, но это может часто меняться с учетом их политик сетевого управления. У вас может быть возможность получить статический IP-адрес, который, как гарантируется, не изменится, но это обычно стоит больше.
Конечно, если вы подключаетесь из кафе или аэропорта или чего-то еще, ваше соединение будет отображаться как внешний IP-адрес.
Было бы наиболее гибким, конечно, открыть ваши привилегии MySQL, чтобы любой клиент из любого IP-адреса мог подключиться (при условии, что они знают имя пользователя и пароль). Но проблема с этим планом заключается в том, что любой клиент из любого IP-адреса мог бы подключиться, т.е. Даже тогда, когда он не был вами.