トップページ
Laravel学習サイトLaravelやるばい

目次

Laravelでディレクトリトラバーサルが何かと 簡単なサンプルコードで解説

みなさんこんにちは、あべいさぢです。

今回はディレクトリトラバーサルが何かと 簡単なサンプルコードで解説します。


ディレクトリトラバーサルとは

「ファイルパスを組み立てる処理」で本来は見られないはずのファイルを「../」 を使って無理アクセスしてやり見られてしまう脆弱性のことです。

意味が分からないと思うので具体的に解説します。

「ファイルパスを組み立てる処理」とは例えばファイルをダウンロードする時のURLが「../../../../xxxxx.csv」みたいにURLを組み立てないといけない時のことです。

この時にわざと「../../../../.env」みたいなURLを入力して本来想定していないファイルをダウンロードできる危険性があることをディレクトリトラバーサルと言います。

ファイルパスを組み立てることができればいいのでファイルをダウンロードする以外の場合だと例えば下記があります。

Laravelで対策するサンプルコードを解説します。


サンプルコード

今回はダウンロードする場合で考えます。

下記のコードだとディレクトリトラバーサルに引っかかります。

public function download($path)
{
    // $pathはURLとする
    return response()->download(storage_path('app/' . $path));
}

このコードの様にURLにそのままアクセスできるようにするのが危険なのでアクセスできないようにします。

例えば下記です。

public function download($path)
{
    $filename = basename(urldecode($path));

    $fullPath = storage_path('app/' . $filename);

    if (!file_exists($fullPath)) {
        abort(404);
    }

    return response()->download($fullPath);
}


URLの「/」や「 ..」 が 「%2F」のようにエンコードされるのをbasename(urldecode($path));」で防いでいます。

storage_path('app');」で引数に指定されたディレクトリにだけアクセスできるようにします。

realpath($basePath . '/' . $decodedPath);」でダウンロードする為の正しいURLを設定します。

if文でURLが存在しなかったりダウンロードするのに正しいURLではない場合は画面が404の表示になります。




戻る