2011-11-18 21 views
3

我一直在檢查一些PHP源代碼和我往往不是查找文件與PHP-「定義或退出」在許多文件的開始?

defined('__someconstant__') or exit(); 

開始我知道,這阻止了文件,如果以前的文件規定__someconstant__直接訪問,但後來不知這是非常必要的......是不是有(甚至非基於PHP的)更乾淨的方式做到這一點,而不是在每個文件中引入額外的代碼?

回答

4

不存在(甚至非基於PHP)更乾淨的方式做到這一點,而無需在每個文件中引入額外的代碼?

存在這樣的片段表示代碼結構錯誤,即代碼在全局範圍內自動執行。您不應該在純函數/類包含中使用此or exit();代碼。那將是多餘的。

執行潛在危險操作的代碼首先不能通過網絡訪問。 or exit;方法是一種解決方法。然而,它應該總是伴隨着FilesMatchDeny from All.htaccess文件中。最好設置整個include目錄不可訪問。

+2

'.htaccess'是依賴於網絡服務器的,這不是。 – NullUserException

+0

是的。但是大多數其他服務器也應該有這樣的功能,如果沒有別的,但全局配置。 Nanoweb擁有'.nwaccess'和nginx一些迷你腳本語言,例如使用suphp/suexec安裝程序,您可以使用目錄權限。 – mario

4

爲了避免在(幾乎)每個文件的頂部那些(沒用)線,您可以:

  • Store中公開的「控制器」的文件(如在一個目錄的index.php稱爲網絡公共上您的Web服務器的別名或虛擬主機指向

  • 存放在其他目錄,如LIBconfigapps ...所有不應通過網絡服務器直接訪問的文件,只需鍵入一個URL即可。

這是典型的現有框架such as Symfony 1.x

此外,您可以(而且一定會爲URL重寫)把.htaccess文件,而是一個服務器配置錯誤可以順便禁用它的結構,因此保持源文件在不同的目錄是IMO更好。

+2

我很驚訝你唯一提到防止直接訪問你的文件的最安全的方法,即不要把它們放在文檔根目錄下! –

+0

@JohnCartwright是的,但這需要額外的配置。此外,這可能不是每個人都可以使用的選項,尤其是對於許多使用共享主機的人。 – NullUserException

+0

@NullUserExceptionఠ_ఠ當使用別名或虛擬主機時,配置難度相同(只需指向'{projectroot}/web'而不是'{projectroot}')。然而,你是對的,這將不適合於配置選項太少的共享主機。但是,如果您不想承擔太多風險(安全性,源代碼隱私,停機...),共享主機可能不是一種選擇。 –

0

添加到@ NullUserException的答案...

是有防止直接訪問的文件(的.htaccess是一個)的其他方式,但對與廣大觀衆共享軟件,可以」真的依賴於那些技術。儘管你可以依靠文件頂部的簡單條件。