PHP安全-源碼暴露(二)

來源:互聯網
上載者:User



源碼暴露

你的WEB伺服器必須要能夠讀取你的源確並執行它,這就意味著任意人所寫的代碼被伺服器運行時,它同樣可以讀取你的源碼。在一個共用主機上,最大的風險是由於WEB伺服器是共用的,因此其它開發人員所寫的PHP代碼可以讀取任意檔案。

 <?php   header('Content-Type: text/plain');  readfile($_GET['file']);   ?>


通過在你的源碼所在的主機上運行上面指令碼,攻擊者可以通過把file的值指定為完整的路徑和檔案名稱來使WEB伺服器讀取並顯示任何檔案。例如,假定該指令碼命名為file.php,位於主機example.org上,只要通過訪問下面連結即可使檔案/path/to/source.php的內容暴露:

http://www.php.cn/

當然,要使這段簡單的代碼起作用,攻擊者必須確切地知道你的源碼的位置,但是攻擊者可以寫出更複雜的指令碼,通過它可以方便在瀏覽整個檔案系統。關於此類指令碼,請看本章後面部分的樣本。

對該問題沒有完美的解決方案。正如第五章所述,你必須考慮所有你的源碼都是公開的,甚至是儲存在WEB主目錄之外的代碼也是如此。

最好的辦法是把所有敏感性資料儲存在資料庫中。雖然這使一些代碼的編寫多了一層複雜性,但這是防止你的敏感性資料暴露的最好方法。很不幸的是,還有一個問題。如何儲存你的資料庫訪問密碼?

請看儲存在網站主目錄之外一個名為db.inc的檔案:

 <?php   $db_user = 'myuser';  $db_pass = 'mypass';  $db_host = 'localhost';   $db = mysql_connect($db_host, $db_user,$db_pass);   ?>


如果該檔案的路徑是已知的(或被猜中),就存在著你的伺服器上的另外一個使用者訪問該檔案的可能,就會擷取資料庫存取權限,這樣你儲存在資料庫中的所有資料就會暴露。

解決該問題的最好方案是把你的資料庫存取權限以下面的格式儲存在一個只有系統管理員許可權才能讀取的檔案中:

 SetEnv DB_USER "myuser"  SetEnv DB_PASS "mypass"


SetEnv是一個Apache的指令,上面檔案的意思是建立兩個分別代表你的資料庫使用者名稱及密碼的Apache環境變數。當然,該技巧的關鍵是只有系統管理員才能讀取該檔案。如果你無法登入成為系統管理員,你就可以限制該檔案只能由你自已進行讀取,這樣的保護方式與上面的方式類似。

 $ chmod 600 db.conf  $ ls db.conf  -rw-------  1 chris chris 48 May 21 12:34db.conf


這就有效地防止了惡意指令碼訪問你的資料中許可權,因此對於資料庫中儲存的敏感性資料來說,不會有危及安全的重大風險。

為使該檔案生效,你就需要能夠通過PHP訪問其中的資料。要達到這個目的,需要在httpd.conf中寫上如下的包含句:

  Include "/path/to/db.conf"


需要注意該語句需要插入在VirtualHost地區內,否則其它使用者就能取得相應的內容。

由於Apache的父進程以系統管理員身份運行(需要綁定在80連接埠),它能夠讀取該設定檔,但處理伺服器請求的子進程(運行PHP指令碼)不能讀取該檔案。

你可以通過$_SERVER超級全域數組去訪問這兩個變數,這樣在db.inc中,只要通過引用$_SERVER變數即可,而不是在其中寫明資料庫的許可權:

<?php   $db_user = $_SERVER['DB_USER'];  $db_pass = $_SERVER['DB_PASS'];  $db_host = 'localhost';   $db = mysql_connect($db_host, $db_user,$db_pass);   ?>


如果該檔案被暴露,資料庫訪問權也不會泄露。這對於共用主機是一大安全性改進,同時對於外掛式主控件也是一種深度防範手段。

注意在使用上述技巧時,資料庫存取權限就位於$_SERVER超級公用數組中。這就需要同時限制普通訪問者運行phpinfo()察看或其它任何導致$_SERVER內容暴露的原因。

當然,你可以使用本技巧保護任何資訊(不只是資料庫存取權限),但我發現把大多數資料儲存在資料庫更為方便,特別是由於該技巧需要得到你的主機供應商的協助。

以上就是PHP安全-源碼暴露(二)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.