2010-12-01 36 views
6

我讀過的東西可能會出錯您的網絡服務器,這可能導致在Web瀏覽器中顯示PHP腳本爲純文本文件;因此我將大部分PHP腳本移到了web根目錄之外的目錄。現在我一直在想,我的cgi-bin中的CGI腳本是否會發生同樣的情況。CGI腳本中的純文本密碼是否存在安全漏洞?

我主要關心的是一個包含我的MySQL數據庫的用戶名和密碼的腳本。如果這是一個可能存在的安全漏洞(至少就數據庫內容而言),是否有辦法將敏感數據放在不同的位置並從那裏獲取(例如將其保存在不同目錄中的文件中並閱讀例如,它來自那個文件)?我的腳本是用Perl編寫的。

回答

10

我讀過的東西可能會出錯你的網絡服務器,這可能導致PHP腳本作爲純文本文件在Web瀏覽器中顯示;因此我將大部分PHP腳本移到了web根目錄之外的目錄。現在我一直在想,我的cgi-bin中的CGI腳本是否會發生同樣的情況。

是的。如果出現錯誤導致程序被服務而不是執行,那麼他們的任何內容都將被暴露。這與使用PHP的問題完全相同(除了給定cgi-bin目錄通常被配置的方式(即別名以外的網頁根目錄),問題發生稍微困難)。

我主要關心的是一個包含我的MySQL數據庫的用戶名和密碼的腳本。如果這是一個可能存在的安全漏洞(至少就數據庫內容而言),是否有辦法將敏感數據放在不同的位置並從那裏獲取(例如將其保存在不同目錄中的文件中並閱讀例如,它來自那個文件)?

是的。確切地說,只要確保目錄不在webroot之外。

爲了獲得更多安全性,請確保數據庫僅接受來自需要訪問它的最小主機集的連接憑據。例如如果數據庫與Web服務器位於同一臺服務器上,那麼只允許憑據爲localhost工作。在這種情況下,導致數據庫僅監聽本地主機網絡接口也是一個好主意。

我的腳本是用Perl btw編寫的。

我想看看使用Config::*模塊之一。

1

這絕對是一個安全問題。您應該將密碼存儲在單獨的文件中,並確保只有您的應用可以訪問它。

+4

存儲加密的密碼不會有太大的幫助,因爲解密它的密鑰也必須可用。作爲一個經驗法則,一個檢查密碼是否正確的系統應該只存儲密碼的哈希值 - 但這對於需要提供密碼的系統不起作用。 – Quentin 2010-12-01 15:42:27

+0

加密是一個額外的安全步驟。這就像你的汽車警報。它不會阻止一個非常好的小偷,但會幫助勸阻一個平庸的小偷。 – esmiralha 2010-12-01 16:23:54

0

如果使用配置爲cgi-bin的目錄,除了Apache配置錯誤外,沒有辦法顯示文件。如果您在cgi-bin目錄之外但在站點根目錄之內使用Perl程序,則可能發生這種情況。另外,您可以將DB配置爲僅接受來自本地套接字的連接,因此瞭解DB密碼將毫無用處。

1

如果你可以避免它,在腳本中硬編碼密碼絕對不是一個好主意。幸運的是,Postgres和MySQL都支持從文件加載DB憑證。對於Postgres你使用〜/ .pgpass和MySQL,我相信它是〜/ .my。CNF。無論哪種情況,您都需要調整權限,以便只有運行該腳本的用戶纔有權讀取該文件。這種方法的優點是,您不必編寫代碼來讀取文件 - 數據庫客戶端庫會自動執行它。

3

值得一提的一個問題是共享主機。

如果您位於與其他用戶共享的主機上,則可能無法從其中隱藏密碼。 這取決於操作系統和網絡服務器的配置細節。

舉例來說,常見的是在Linux上的Apache配置上爲用戶的唯一途徑提供一個網站,使文件讀寫的網絡服務器用戶,使其可讀/寫於所有用戶。

您可以信任所有這些用戶不要自行濫用此功能,但如果其中一個網站具有允許入侵者查看完整文件系統的漏洞,則入侵者可以在所有其他網站上利用此漏洞。

有對策可以解決這個問題,但是它們會讓用戶複雜化,所以很多託管服務器都不會實現它們。

0

你已經得到了更好的答案比我可以提供,但作爲一張紙條:

這是很不禮貌的密碼保存爲純文本,期。

以同樣的方式,它是非常糟糕的形式覆蓋或刪除文件沒有請求權限。如果你這樣做,它會最終咬你或你的客戶。