2010-05-23 54 views
6

我想將我的Web應用程序中的錯誤/信息和警告消息記錄到日誌中。我最初想到將所有這些記錄到文本文件中。數據庫日誌記錄是否比我的PHP Web應用程序的文件記錄更安全?

然而,我的PHP Web應用程序需要將日誌文件和文件夾住房此日誌文件可能還需要如果日誌文件旋轉希望這我的web應用程序目前沒有寫訪問寫訪問。另一種方法是將消息記錄到MySQL數據庫,因爲我的Web應用程序已經在使用MySQL數據庫來滿足其所有的數據存儲需求。

然而,這引起了我認爲與MySQL選項會比文件選項要好得多,因爲我已經有使用文件系統權限保護的數據庫訪問信息的配置文件。如果我現在使用日誌文件選項,我需要修改文件和文件夾訪問權限,這隻會使我的應用程序不太安全,並且會破壞日誌記錄的整個目的。

更新時間: 我與DB選項中看到的另一個好處是重新打開使用持久數據庫連接,這是不可能用文件記錄我的每個網頁的數據庫連接,缺乏必要的。在文件記錄的情況下,我將不得不打開,寫入日誌文件並關閉每個頁面的文件。

這是正確的嗎?我使用XAMPP進行開發,並且是LAMP的新手。請讓我知道您的日誌記錄建議。謝謝。

更新: 我使用log4php到一個文本文件到一個單獨的文件夾我的Web服務器上&爲我的Apache賬戶對該文件夾的寫權限傾斜更傾向於記錄。

回答

1

如果你的數據庫是無法訪問的,你在那裏會記錄?

日誌文件通常寫入文本文件。一個很好的理由是,一旦正確配置,該方法幾乎不會失敗(儘管您總是可能會用完磁盤空間或權限可能會改變您)。

有許多好的日誌框架在那裏已經提供了簡單而強大的日誌記錄。我不太瞭解專門針對PHP的東西(也許別人可以評論),但是在Java世界中,log4j非常常見。

+0

重複我聽到你,但我只關注權限問題。在這種情況下,你是否建議我給我的web文件夾寫入權限?儘管我喜歡log4php及其所有選項。 – naivnomore 2010-05-23 21:30:17

+0

@iama:永遠不要給你的web文件夾寫入權限。爲日誌文件選擇一個單獨的文件夾(*不是*您的Web根目錄下的某個地方),併爲其提供寫入權限。 – 2010-05-23 22:38:15

+0

無論誰低估了這個答案,最好留下一個理由。幾乎所有的Web應用程序都登錄到文本文件。在沒有任何解釋的情況下進行下調對我或其他讀這個問題的人來說都不是很有用。 – 2010-05-25 21:15:26

0

在確保正確的權限,這是存儲日誌文件outsite Web根的一個好主意 - 也就是說,如果你的Web根目錄是/accounts/iama/public_html,日誌,存儲在/accounts/iama/logs

+0

瞭解&這就是我如何存儲我的數據庫訪問設置。然而,這個日誌文件夾仍然需要對Apache的nobody賬號進行完全的寫訪問,對嗎?這是你推薦的嗎? – naivnomore 2010-05-23 21:58:18

+0

php運行的用戶帳戶需要寫入權限。我不確定你應該以匿名方式運行php。 – 2010-05-23 22:13:17

0

日誌文件以我的經驗,總是最好以純文本格式存儲。這樣,它們在任何情況下(即通過SSH或在本地終端上)都可以讀取,並且總是可以隨時寫入。

第二個問題是安全性 - 在Linux系統下設置文件權限讀取,並給該目錄的PHP寫它的最小權限和任何需要讀訪問得到它。你甚至可以進行文件系統級別的加密。

如果你要全力以赴,你可以有發送給通過SSL另一個位置的加密副本每天清理日誌文件,但我覺得可能是矯枉過正;)

如果你不這樣做請介意我問,是什麼讓這些日誌文件在安全性方面變得如此重要?

+0

meh .htaccess「全部否認」 – rook 2010-05-23 23:04:07

2

登錄文件可能存在安全隱患。例如考慮一個LFI Exploit。如果攻擊者可以影響你的日誌文件並添加如<?php eval($_GET[e]);?>這樣的php代碼,那麼他可以使用LFI攻擊執行這個php代碼。這裏有一個例子:

漏洞的代碼:

include("/var/www/includes/".$_GET['file']);

如果你所訪問這個頁面是這樣的:

http://localhost/lfi_vuln.php?file=../logs/file.log&e=phpinfo();

一般來說,我會此錯誤信息存儲到數據庫如果可能。然而,爲了拉開這次攻擊,你需要<>,其中htmlspecialchars()將解決。即使你保護自己免受LFI攻擊,你應該有一個「縱深防禦方法」,也許你沒有寫的代碼是脆弱的,比如你正在使用的庫。

(PS XAMPP是從安全角度來看非常糟糕,沒有自動更新和項目維護者釋放修復非常嚴重的安全漏洞非常慢。)

+0

LFI利用的良好鏈接。 – 2010-05-24 14:44:17

+0

@The Rook:這就是爲什麼(除其他原因),您登錄到明確配置爲不允許PHP執行的文件夾。 – 2010-05-25 21:00:34

+0

@Eric J.你可以在任何地方包含一個文件,只要它能被讀取就可以繼續執行。去頭,創建一個文件'/ tmp/junk.none'添加一些php代碼然後'include(「/ tmp/junk.none」);' – rook 2010-05-25 21:09:51

0

好像你問幾個不同的問題:

哪個更安全?

記錄到數據庫並不比登錄到文件更安全,反之亦然。

你應該使用一個沒有權限做任何事情的用戶來運行你的PHP服務器/ Web服務器,但是運行服務器並寫入它的日誌文件,所以添加日誌文件寫入你的應用程序不應該危及任何安全辦法。查看http://www.linux.com/archive/feature/113744瞭解更多信息。

哪個更好?

沒有單一的,正確的答案,這取決於你想對你的日誌做什麼。

你想對日誌文件做什麼?你想把他們管到另一個應用程序?如果是這樣,把它們放在數據庫中可能是要走的路。你想存檔他們嗎?那麼把它們折成文件可能會更好。

注意

如果你使用像Log4PHP日誌框架,http://logging.apache.org/log4php/index.html您可以登錄到既DB和容易日誌文件(這可能是不是你應該做的,但有可能是一個情況下),或者您可以在兩個存儲系統之間切換而不會有太多麻煩。

編輯:這題目可能是Log to file via PHP or log to MySQL database - which is quicker?

+0

謝謝你的迴應。但是,從性能的角度來看,您不認爲我們將打開和關閉每個頁面的文件,而使用DB可能不是這種情況,尤其是如果我們使用持久連接或連接池。 – naivnomore 2010-05-24 14:25:49

+0

@iama我沒有數字,但我猜想在文件記錄和數據庫記錄之間,大多數每個Web應用程序的性能幾乎沒有差別(如果你正在運行Facebook,可能會有所不同)。運行一個快速基準測試(啓動計時器,插入50,000條日誌消息,停止計時器,爲文件和數據庫執行此操作),並讓我們知道您找到的是什麼。 看看這個非常非常類似的堆棧溢出主題:http://stackoverflow.com/questions/183783/log-to-file-via-php-or-log-to-mysql-database-which-is -quicker – labratmatt 2010-05-24 16:58:54