2012-12-18 54 views
2

有時我得到這個在我的網絡服務器日誌:SQL查詢不進行注射,但

[09日 - 12月2012 15時35分45秒歐洲/柏林] PHP的警告:請求mysql_query()函數。 MySQL的查詢]:訪問被拒絕 用戶 '根' @ '本地主機'(使用密碼:否)在/bar/foo.php上 線4

線4是:

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

我t看起來像有人試圖使用默認的根用戶名登錄。 任何方式來防止這種情況,即使它不是有害的? 他如何設法通過該行代碼進行連接?

感謝

+0

它的怪異,因爲用戶名和通應該是一樣的,對DB這是相同的用戶是誰連接(在APP).. – jcho360

+1

[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 – Kermit

+0

謝謝,我會看看這兩個,並會讓你在這個頁面上更新你。 – flapane

回答

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/

+0

準確地說,就是我在閱讀本文之前所寫的內容。 :)在此期間,我也會切換到mysqli(我不知道mysql_foo()正在被淘汰)。 – flapane

2

mysql_query()函數試圖連接到使用,如果沒有連接已尚未建立默認的用戶名和密碼(在php.ini configued)MySQL服務器。這是因爲它應該運行查詢,並且如果尚未調用mysql_connect(),則它不能。

這裏唯一錯誤的是PHP代碼。在多個級別btw ..這些天應該使用mysqliPDO

+0

我會嘗試使用mysqli。似乎php文件是由惡意用戶手動加載的。但是該文件不包含證書(包含在另一個php文件中),因爲它不應該被打開,而是被包含在證書所在的另一個文件中。 – flapane

+0

我推薦使用.htaccess或「define(」MAIN_CODE「,TRUE); //在包含憑證的文件中」和「if(!is_defined(」MAIN_CODE「))die(」go away!「)來阻止訪問;」 //在包含文件 –

0

的mysql_query是一直沒有連接回落到默認值在php.ini連接(做的phpinfo();看看這些)

的默認值是無法連接到根目錄,並給予該錯誤。

同意長庚富庫MySQLi使用或PDO

0

using password: NO意味着你有沒有密碼。 嘗試去管理員和設置密碼,那麼它將是: YES。 或使指定密碼到root

爲對方表示使用PDO或mysqli的

+0

我有,但在閱讀了Chris的評論之後,我注意到如果你加載單個文件(並且你不應該這樣做,因爲文件需要被包含在其他地方) ,它將缺乏憑據。 – flapane

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'];

+0

結構: 1)包含憑證的主要php文件()。 2)mysql_query()在php主文件中包含php文件()。 我的猜測是惡意機器人/用戶正試圖直接使用mysql_query()加載其中的php文件,以便憑證不包含()(它們在主php文件中)。 – flapane