2013-02-21 84 views
2

爲了安全起見,我已禁用了php.ini中的函數glob並且它按預期工作,但我也注意到phpinfo顯示以下信息:如何取消註冊特定的「註冊PHP流」?

註冊的PHP流:php,file,glob,data,http ,FTP,ZIP,compress.zlib,藥業

所以,如果我採取以下來源:

$it = new DirectoryIterator("glob://C:\wamp\www\*"); 
foreach($it as $f) {  
    printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024); 
} 

它仍然會返回指定目錄的內容。

如何全局註銷PHP流如glob?

+1

這是爲了什麼「安全原因」?我沒有看到任何 – KingCrunch 2013-02-21 08:53:02

+0

安全在硬化的意義上。如果應用程序不需要它,則只是防止攻擊者獲得目錄內容信息的另一步驟,例如,他們能夠上傳任意文件。當然,如果有人能夠上傳任意文件,還有很多其他的含義,但這不是問題。 – Steven 2013-02-21 09:17:22

回答

2

簡短的答案是:甚至不打擾嘗試。

PHP是一種足夠完整的語言,如果有人要寫髒的易受攻擊的代碼,他們可以通過任何你設置的塊來完成。禁用這樣的函數只會讓應用程序開發人員的生活變得糟糕。

它已經證明,之類的東西safe_modeopen_basedir實際上安全的東西。原因是雙重的:

  1. 黑名單(這是什麼safe_mode是)不起作用。這已經被反覆證明。

  2. 你不能在不安全的基地上安全。已經太晚了。 PHP本身已經有足夠的訪問權限,即使你禁用了所有有趣的部分,人們仍然可以繞過它。

相反,保護自下而上。安裝一個chroot監獄,並在其中運行PHP。使用適當的權限。查看您在服務器上運行的代碼。監視服務器是否存在入侵。沒有什麼花哨。只是良好的老式SYS-管理工作...

要回答你原來的問題

,你可以註銷流包裝是通過stream_wrapper_unregister()自己做的唯一途徑。你可以使用一個自動prepend文件爲你做(在每個腳本之前運行該代碼)。

但意識到在PHP中實現glob是微不足道的。所以真的沒有太多的意義,在禁用它...