AllowedHostRegexp
in package
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
boolhostPattern()
ホスト名を正規表現の部分パターンに変換する。
private
static hostPattern(string $host) : string|null
Parameters
- $host : string
Return values
string|null —空文字なら null