2012-04-23 81 views
0

我怎樣才能正確地篩選出本地文件包含在PHP? 我一直在尋找,但找不到一個簡單的功能來做到這一點。據我瞭解,刪除斜槓是不夠的。正確過濾掉LFI

+0

您需要擴大您的問題 - 其過濾出在哪裏?你想避免什麼? – Cal 2012-04-23 18:25:43

+0

PHP輸出另一個文件前:example.com/index.php?page=../../etc/passwd – 2012-04-23 18:28:50

回答

4

永遠不要在用戶輸入中使用include()(或其親屬,如require()readfile())。永遠。

+0

有根本不過濾用戶輸入一個安全的方式? – 2012-04-23 18:32:27

+0

不充分。如果您需要包括基於用戶輸入的文件,你應該:1)查找基於該公司在通過或2)保留批准文件名的白名單中的一些關鍵的實際文件名。否則,意外地允許訪問意外文件太容易了。 – duskwuff 2012-04-23 18:38:50

1

避免這個問題的最簡單方法是不是從用戶輸入編寫代碼,include()的 - 通常沒有必要做這個。而不是讓您的網址爲foo.php?page=bar只需使用bar.php作爲URL。

如果你絕對必須的,你可以去在幾個方面篩選。白名單很容易:

$ok = array('foo.php', 'bar.php', 'baz.php'); 
$include = in_array($_GET['page'], $ok) ? $_GET['page'] : 'default.php'; 
include($include); 

這隻允許預先設置的包含文件列表。

或者,你可以用正則表達式過濾器(但是這是更容易出錯):

if (preg_match('!^[a-z]+\.php$!', $_GET['page'])){ 
    include($_GET['page']); 
}else{ 
    include('default.php'); 
} 
+0

爲什麼後者的例子是不好的,請參閱: http://security.stackexchange.com/questions/17407/how-can-i-use-this-path-bypass-exploit-local-file-inclusion – 2015-09-18 14:18:56