[英]SQL query not subjected to injection, but
有时我会在我的网络服务器日志中得到这个:
[09-Dec-2012 15:35:45欧洲/柏林] PHP警告:mysql_query()[function.mysql-query]:在/ bar /中拒绝用户'root'@'localhost'(使用密码:NO)的访问第4行的foo.php
第4行是:
$sql=mysql_query("select * from mytablefoo ORDER BY id DESC LIMIT 9");
似乎有人试图使用默认的root用户名登录。 有什么办法可以防止这种情况发生,即使它没有危害? 他如何通过该代码行进行连接?
谢谢
此错误表示在这种情况下,此文件将使用所有默认值而不使用任何密码来尝试以没有正确特权的方式访问数据库。
我猜您的数据库凭据存储在另一个文件中。 您可以这样引用该文件:
include( $_SERVER['DOCUMENT_ROOT'] . '/filepath/db.php');
我知道一个事实, $_SERVER
数组由访问您的网站的用户部分填充。 这意味着其中一些变量可以为空或被篡改。 例如,当通过CRON Job
激活页面时,该特定变量将为空。
IIRC,也可以通过访问网站的IP地址而不是域名(即: http://192.168.0.1/bar/foo.php
: http://192.168.0.1/bar/foo.php
而不是http://example.com/bar/foo.php
来操纵此数组http://example.com/bar/foo.php
)。
您可以使用__FILE__
变量而不是$_SERVER['DOCUMENT_ROOT'];
我认为这是正在发生的事情。
您有一个页面(例如: 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
更多信息:
mysql_query是否没有连接回退到php.ini中的默认连接(执行phpinfo();查看这些信息)
默认设置无法连接到root并给出该错误。
同意与Gung Foo使用mysqli或PDO
using password: NO
表示您没有密码。 尝试进入管理员并设置密码,密码为: YES
。 或为root
分配密码
如其他所说使用PDO或mysqli
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.