請求清理$_GET['']
的最佳方法是什麼?我想只允許從一個目錄下載文件。
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . $_GET['file']);
下一步是什麼?
請求清理$_GET['']
的最佳方法是什麼?我想只允許從一個目錄下載文件。
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . $_GET['file']);
下一步是什麼?
這裏是我會在行之後你有沒有:
if (dirname($path) === $baseDir) {
//Safe
}
基本上,做發送任何該文件實際上是在你支持一個路徑前的檢查。請注意,您還必須在文件名前($path
)添加自己的/
,並將其從$baseDir
定義中刪除,因爲dirname()
不會留下尾隨路徑分隔符。
在將$_GET
指定爲$path
之前,您需要清理該值。
我推薦使用PHP自己的消毒功能(http://php.net/manual/en/function.filter-input.php和http://php.net/manual/en/filter.filters.sanitize.php)。需要PHP> = 5.2.0,
而不是後檢查沒有相對路徑碎片存在,更容易馬上剝離它們。只需使用basename()
立即當你獲取值:
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . basename($_GET['file']));
已經保證它不能從基本目錄中向上或向下移動。
那你應該絕對不允許'..' –
這是全部嗎?之後,我的腳本將是安全的? – Adrian
不,不允許使用'/'和其他文件中不存在的字符。 – jli