2

有时我会在我的网络服务器日志中得到这个:

[09-Dec-2012 15:35:45 Europe/Berlin] PHP 警告:mysql_query() [function.mysql-query]:/bar/ 中用户 'root'@'localhost' 的访问被拒绝(使用密码:否)第 4 行的 foo.php

第 4 行是:

$sql=mysql_query("select * from mytablefoo ORDER BY id DESC LIMIT 9");

看起来有人试图使用默认的 root 用户名登录。有什么办法可以防止这种情况发生,即使它没有害处?他是如何通过那行代码进行连接的?

谢谢

4

5 回答 5

2

mysql_query()如果尚未建立连接,该函数会尝试使用默认用户名和密码(在 php.ini 中配置)连接到 mysql 服务器。那是因为它应该运行一个查询,如果mysql_connect()还没有被调用,它就不能。

这里唯一错误的是 PHP 代码。顺便说一句,在不止一个级别上。这些天应该使用mysqliPDO 。

于 2012-12-18T14:57:41.773 回答
1

这个错误意味着这个文件在这种情况下试图在没有正确权限的情况下访问您的数据库,使用所有默认值而没有任何密码)。

我猜您的数据库凭据存储在另一个文件中。你可以像这样引用这个文件:

include( $_SERVER['DOCUMENT_ROOT'] . '/filepath/db.php');

我知道该$_SERVER数组部分由访问您网站的用户填充。这意味着其中一些变量可以为空或以其他方式被篡改。例如,当通过 a 激活页面时CRON Job,此特定变量将为空。

IIRC,也可以通过访问网站的 IP 地址而不是域名来操纵这个数组(即:http://192.168.0.1/bar/foo.php而不是http://example.com/bar/foo.php)。

您可以通过使用__FILE__变量而不是$_SERVER['DOCUMENT_ROOT'];

于 2012-12-18T15:10:16.673 回答
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

http://perishablepress.com/stupid-htaccess-tricks/

于 2012-12-18T16:41:58.210 回答
0

mysql_query 是没有连接回退到 php.ini 中的默认值来连接(执行 phpinfo(); 来查看这些)

默认设置无法连接到 root 并给出该错误。

同意 Gung Foo 使用 mysqli 或 PDO

于 2012-12-18T15:01:17.450 回答
0

using password: NO 表示您没有密码。尝试进入管理员并设置密码,然后它将是: YES。或为root

正如其他人所说,使用 PDO 或 mysqli

于 2012-12-18T15:02:45.643 回答