2013-10-08 17 views
0

我在Stackoverflow瞭解了很多,這是我最喜歡的編程網站,在這裏進行研究後,我發現了許多問題的答案。 現在我已經完成了我需要知道的代碼:它是否有任何安全缺陷?即使使用is_file包含文件的安全

它需要從url中獲取域名,以便查看目錄中是否存在包含該表達式的var文件並輸出其內容。 您的幫助真的很感謝!

如果我使用htmlspecialchars和preg_replace清理HTTP_HOST就足夠了嗎?使用strip_tags會矯枉過正,不是嗎?從陣列中移除這些特殊字符也是多餘的,你不覺得嗎?

編輯

我將修改代碼並添加保護,使包括文件本身。非常感謝!

+3

你應該永遠不會讓任何用戶提供的數據附近獲得與文件系統處理操作的任何地方,特別是在像'include'這樣危險的事情上。這不容易被利用,但我相信有人可以弄清楚如何去做。 –

+2

你爲什麼要檢查域名的文件存在?你知道HTTP_HOST是一個用戶提供的var,它幾乎可以包含任何東西嗎? –

+0

這對我來說是一個困境,但我真的需要從HTTP_HOST獲取域名。 如果我不僅可以剝離域擴展名,還可以剝離「/」,「。」 ,「=」,「;」等等,它不會解決問題嗎? – echolearning

回答

1

不可以。您應該使用允許的表達式的白名單。對於像include這樣危險的事情,你絕對不想依靠黑名單和簡單的消毒。

你也可以硬編碼哪個目錄包含你的PHP文件。

+0

+1:白名單無法避免! – geomagas

+0

如果白名單有成千上萬的條目在服務器上不會很難? – echolearning

+0

不代表你會有成千上萬的'* var.php '文件?我錯過了什麼嗎? – geomagas

0

假如你把所有在一個特殊的目錄*var.php文件(假設/var/www/include/vars/),你可以閱讀到一個數組,而該數組的邊界內的限制,而不是僅僅is_file() ING選擇,:

$vardir='/var/www/include/vars/'; 
$varfiles=array(); 
foreach(scandir($vardir) as $fn) 
    if(($fn!='.')&&($fn!='..')) 
    $varfiles[]="$vardir$fn"; 

/* Next, do whatever sanitizing you see fit */ 

if(array_find($fnvar)) include_once $fnvar; 

請注意,這實質上是白名單,在評論中提到:如果在$vardir目錄中創建新的{xyz}var.php,則實際上是在白名單中插入一個新條目。

因此,作爲@ack__也指出,你不能避免白名單拉上......

+0

非常感謝您的詳細解答。我的問題是處理時間/負載檢查:/ – echolearning

+0

那麼,你的問題是安全特定的。如果您決定採用這種方式,我相信會有大量優化技術可供您使用。 – geomagas

+0

我真的很感激。 – echolearning

相關問題