2016-06-26 12 views
1

私はPHPソリューションを読んでいて、私を混乱させるこれらのコード行に出くわしました。コードの7行で PHPとのダウンロードリンクを作成

// define error page 
$error = 'http://localhost/phpsols/error.php'; 
// define the path to the download folder 
$filepath = 'C:/xampp/htdocs/phpsols/images/'; 

$getfile = NULL; 

// block any attempt to explore the filesystem 
if (isset($_GET['file']) && basename($_GET['file']) == $_GET['file']) { 
    $getfile = $_GET['file']; 
} else { 
    header("Location: $error"); 
    exit; 
} 

、なぜ $_GET['file']と等しくない basename($_GET['file'])をでしょうか?

答えて

3

誰かがhttp://example.com/file.txtまたはpath/file.txtまたは../../../../etc/hostsから$_GET['file']のようなものを渡した場合、ベースネームは一致しません。

basename($file) == $fileは、パスのない値(ファイル名のみ)が指定された場合にのみtrueになります。

+0

こんにちは、お返事ありがとう!もう1つのフォローアップの質問:コードの2行目では、どのフォルダを調べるか、既に理論的には安全ではないでしょうか? 'download.php?file = .../index.php'を試したところ、ファイルには – Gnahzllib

+0

が表示されませんでした。' C:/ xampp/htdocs/phpsols/images/$ _GET ['file'] = '../../../../ windows/system32/file'で 'C:/' +ドットの後ろにあったパスを解決します。 – drew010

+0

'$ _GET ['file'] = '../../../../ windows/system32/file'は' C:/ windows/system32/file'になりますか? – Gnahzllib

0

コードの7行目で、basename($ _ GET ['file'])が$ _GET ['file']と等しくないのはなぜですか?

$_GET['file']にはパス区切り文字が含まれています。

関連する問題