StorageDirPolicy
in package
storage/ 直下のディレクトリ名が書き出し対象(添付ファイルの実体)かを判定する。
Why not: storage/ 直下にはバックアップ・エクスポート類の非メディアディレクトリも置かれ、 その一覧は運用機能の追加ごとに増減し、unzip や SiteSeeder のように任意名のディレクトリを 作る経路もあるため列挙しきれない。数字ディレクトリだけを通す許可リスト(既定拒否)にする。
Table of Contents
Constants
- SAFE_NAME_PATTERN = '/\A[0-9A-Za-z_.-]+\z/'
- 許可名として受け付ける名前の文字種。英数字・アンダースコア・ハイフン・ピリオドのみ。
Methods
- isMediaDirName() : bool
- storage/ 直下のディレクトリ名が書き出し対象(添付ファイルの実体)かを判定する。
- normalizeAllowedNames() : array<int, string>
- 設定文字列(カンマ区切り)から許可名の配列を作る。
- isSafeName() : bool
- ディレクトリ名として安全な文字種のみで構成され、'.' '..' でないかを判定する。
Constants
SAFE_NAME_PATTERN
許可名として受け付ける名前の文字種。英数字・アンダースコア・ハイフン・ピリオドのみ。
private
mixed
SAFE_NAME_PATTERN
= '/\A[0-9A-Za-z_.-]+\z/'
Why not: 現在の唯一の呼び出し元(Engine::copyStorageMedia)は mbBasename() 済みの値しか 渡さないためパス区切り文字は実害が無いが、この判定はクラス名どおり「安全な名前だけを true にする」ことを保証する必要がある。将来 $allowedNames をパス構築に使う実装が増えた時点で トラバーサルが実在化するため、判定の入口で '/' '' 等を含む名前を拒否しておく。
Methods
isMediaDirName()
storage/ 直下のディレクトリ名が書き出し対象(添付ファイルの実体)かを判定する。
public
static isMediaDirName(string $name, array<int, string> $allowedNames) : bool
ブログ数が 1000 を超えると sprintf('%03d') は 4 桁を返すため桁数は固定しない。
Parameters
- $name : string
-
ディレクトリ名(basename)
- $allowedNames : array<int, string>
-
設定で追加された許可名
Return values
boolnormalizeAllowedNames()
設定文字列(カンマ区切り)から許可名の配列を作る。
public
static normalizeAllowedNames(string $config) : array<int, string>
Why not: explode(',', '') は [''] を返すため、trim だけでは空文字が許可名として 残ってしまい isMediaDirName() で空名ディレクトリを許可してしまう。空要素を明示的に除く。 併せて isSafeName() でパストラバーサルにつながる名前('..' や '/' を含む名前)も 入力の時点で捨てる(isMediaDirName() 側の防御と二重になるが、設定値の保存内容自体を 安全な状態に保つため、正規化の段階でも落としておく)。
Parameters
- $config : string
Return values
array<int, string>isSafeName()
ディレクトリ名として安全な文字種のみで構成され、'.' '..' でないかを判定する。
private
static isSafeName(string $name) : bool
Parameters
- $name : string