有时我会在我的网络服务器日志中看到这个:
[2012年12月9日15:35:45欧洲/柏林] PHP警告:mysql_query()[function.mysql-query]:拒绝访问 对于用户&root;' @' localhost' (使用密码:NO)在/bar/foo.php上 第4行
第4行是:
$sql=mysql_query("select * from mytablefoo ORDER BY id DESC LIMIT 9");
看起来有人试图使用默认的root用户名登录。 有什么方法可以防止这种情况,即使它没有害处? 他如何设法通过这行代码连接?
由于
答案 0 :(得分:2)
如果尚未建立连接,mysql_query()
函数将尝试使用默认用户名和密码(在php.ini中配置)连接到mysql服务器。那是因为它应该运行一个查询,如果还没有调用mysql_connect()
,它就不能。
答案 1 :(得分:1)
此错误表示此文件在没有正确权限的情况下尝试访问您的数据库,使用所有默认值而没有任何密码。
我猜你的数据库凭据存储在另一个文件中。您可以像这样引用此文件:
include( $_SERVER['DOCUMENT_ROOT'] . '/filepath/db.php');
我知道$_SERVER
数组部分由访问您网站的用户填充。这意味着其中一些变量可能为空或以其他方式被篡改。例如,当通过CRON Job
激活页面时,此特定变量将为空。
http://192.168.0.1/bar/foo.php
而不是http://example.com/bar/foo.php
)。
您可以使用__FILE__
变量代替$_SERVER['DOCUMENT_ROOT'];
答案 2 :(得分:1)
以下是我的想法。
您有一页(例如:index.php
)包含第二页(例如:/bar.foo.php
)。在index.php
上,您建立了主要连接:
<?php
// index.php
// ...
$db = mysql_connect($db, $username, $password);
// ...
在第二页上,您可以执行一些功能:
<?php
// /bar/foo.php
// ...
mysql_query("select * from mytablefoo ORDER BY id DESC LIMIT 9"); // TODO: use mysqli or PDO here
// ...
但是,如果您直接访问第二个文件,则没有数据库连接,因此它尝试使用默认凭据进行连接,失败并抛出错误。
如果您想阻止这种情况,那么您需要保护您的网站。我的猜测是永远不允许人们进入你的/bar
文件夹。您可以通过向此文件夹添加.htaccess
文件来阻止人们输入此文件夹。
.htaccess
个文件可让您控制用户与您网站上的文件进行互动的方式。只需创建一个新的文本文件,并将其另存为.htaccess
(此文件在.
之前没有任何内容。)
将此文件放在/bar
文件夹中,并将以下文本放在文件中:
deny from all
现在,如果有人试图直接访问此文件夹,则会显示403错误消息。其他页面仍然可以包含PHP文件。
您可以在此处详细了解.htaccess
:
答案 3 :(得分:0)
mysql_query是没有连接回落到php.ini中的默认连接(做一个phpinfo();看看这些)
默认设置无法连接到root并发出错误。
同意Gung Foo使用mysqli或PDO
答案 4 :(得分:0)
using password: NO
表示您没有密码。
尝试转到管理员并设置密码,然后它将是: YES
。
或者为root
正如其他人所说的那样使用PDO或mysqli