a-blog cms PHP API Reference

AllowedHostRegexp
in package

FinalYes

URL(iframe の src / script の src)を許可ホストに限定するための PCRE を生成・判定する。

HTMLPurifier の URI.SafeIframeRegexp はホスト文字列をそのまま正規表現に流すため、 preg_quote によるメタ文字の安全化、プロトコル相対 (//) / http / https の吸収、 ポート以外での区切り偽装(userinfo @ など)の排除を一箇所に集約する。

build() と matches() が同一の正規表現ロジックを共有することで、 SafeIframe フィルタの判定(URI.SafeIframeRegexp)と post-transform でのホスト解決(IframePolicyTransform / ScriptPolicyTransform)の 結果が一致することを保証する。

Table of Contents

Constants

DOT_SEGMENT_GUARD  = '(?![^?#]*[/\\\\](?:\.|\%2e){1,2}(?:[/\\\\?#]|$))'
パスに `.` / `..` のセグメント(`%2e` 表記を含む。`\` も区切りとみなす)を持つ URL を拒否する先読み。

Methods

build()  : string|null
許可ホストの配列から URI.SafeIframeRegexp 用の PCRE を生成する。
matches()  : bool
単一ホストに対して URL がマッチするか判定する。
hostPattern()  : string|null
ホスト名を正規表現の部分パターンに変換する。

Constants

DOT_SEGMENT_GUARD

パスに `.` / `..` のセグメント(`%2e` 表記を含む。`\` も区切りとみなす)を持つ URL を拒否する先読み。

private mixed DOT_SEGMENT_GUARD = '(?![^?#]*[/\\\\](?:\.|\%2e){1,2}(?:[/\\\\?#]|$))'

ブラウザは src を読み込む前にドットセグメントを解決するため、www.youtube.com/embed 許可に対する /embed/../evil は前方一致を通過したうえで許可パスの外(/evil)を読み込んでしまう。 HTMLPurifier は非予約文字の %2e を . に復号して保持するため、エンコード表記も同じ扱いになる。

Why not ドットセグメントを解決(正規化)してから照合しないか: 正規表現は URI.SafeIframeRegexp として HTMLPurifier 側にもそのまま渡すため、照合前に URL を書き換える 余地が無い。正当な埋め込み URL がドットセグメントを含むことは無いので、拒否で足りる。

Methods

build()

許可ホストの配列から URI.SafeIframeRegexp 用の PCRE を生成する。

public static build(array<string|int, string> $hosts) : string|null
Parameters
$hosts : array<string|int, string>

許可ホスト名の配列

Return values
string|null —

有効なホストが無い場合は null(iframe を許可しないシグナル)

matches()

単一ホストに対して URL がマッチするか判定する。

public static matches(string $url, string $host) : bool

build() と同一の正規表現を用いるため、SafeIframe フィルタの通過可否と一致する。

Parameters
$url : string

判定対象の URL(iframe の src)

$host : string

許可ホスト名

Return values
bool

hostPattern()

ホスト名を正規表現の部分パターンに変換する。

private static hostPattern(string $host) : string|null
Parameters
$host : string
Return values
string|null —

空文字なら null


        
On this page

Search results