a-blog cms PHP API Reference

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
bool

normalizeAllowedNames()

設定文字列(カンマ区切り)から許可名の配列を作る。

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
Return values
bool

        
On this page

Search results