SQL查询不受注入,但是

时间:2012-12-18 14:54:28

标签: mysql sql sql-injection

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

  

[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用户名登录。 有什么方法可以防止这种情况,即使它没有害处? 他如何设法通过这行代码连接?

由于

5 个答案:

答案 0 :(得分:2)

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

这里唯一错误的是PHP代码。在不止一个级别btw ..这些天应该使用mysqliPDO

答案 1 :(得分:1)

此错误表示此文件在没有正确权限的情况下尝试访问您的数据库,使用所有默认值而没有任何密码。

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

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

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

IIRC,也可以通过访问网站的IP地址而不是域名来操纵这个阵列(即: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

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

答案 3 :(得分:0)

mysql_query是没有连接回落到php.ini中的默认连接(做一个phpinfo();看看这些)

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

同意Gung Foo使用mysqli或PDO

答案 4 :(得分:0)

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

指定密码

正如其他人所说的那样使用PDO或mysqli