HeaderValidator
in package
Webhook のカスタムヘッダー名・値を検証する。 保存時(ACMS_POST_Webhook 系)と送信時(Engine::buildHeaders())の両方から呼び出す共通ロジック。
Table of Contents
Constants
- HEADER_NAME_PATTERN = '/^[!#$%&\'*+\-.^_`|~0-9A-Za-z]+$/'
- RFC 7230 の field-name(token)で許可される文字。 「tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA」に対応する。
- RESERVED_HEADER_NAMES = ['host', 'content-length', 'transfer-encoding', 'connection', 'content-type']
- プロトコル制御に関わる予約ヘッダー名(大文字小文字を区別しないブロックリスト方式)。 Content-Type は専用セレクトボックス(webhook_content_type)に責務を分離したため、 カスタムヘッダー欄からの指定自体を禁止する。
Methods
- isNameRequired() : bool
- ヘッダー名が空で値だけ入力されている状態かどうかを判定する。 管理画面側で「値のみの保存はできません」という専用メッセージを出すために isValid() から分離している。
- isValid() : bool
- ヘッダー名・値が安全かどうかを検証する。 CRLF(\r, \n)を含む場合、または予約ヘッダー名と一致する場合は false を返す。
- isValidName() : bool
- ヘッダー名が RFC 7230 の token として妥当かどうかを検証する。
- containsCrlf() : bool
Constants
HEADER_NAME_PATTERN
RFC 7230 の field-name(token)で許可される文字。 「tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA」に対応する。
private
mixed
HEADER_NAME_PATTERN
= '/^[!#$%&\'*+\-.^_`|~0-9A-Za-z]+$/'
RESERVED_HEADER_NAMES
プロトコル制御に関わる予約ヘッダー名(大文字小文字を区別しないブロックリスト方式)。 Content-Type は専用セレクトボックス(webhook_content_type)に責務を分離したため、 カスタムヘッダー欄からの指定自体を禁止する。
private
mixed
RESERVED_HEADER_NAMES
= ['host', 'content-length', 'transfer-encoding', 'connection', 'content-type']
Methods
isNameRequired()
ヘッダー名が空で値だけ入力されている状態かどうかを判定する。 管理画面側で「値のみの保存はできません」という専用メッセージを出すために isValid() から分離している。
public
isNameRequired(string $name, string $value) : bool
Parameters
- $name : string
- $value : string
Return values
boolisValid()
ヘッダー名・値が安全かどうかを検証する。 CRLF(\r, \n)を含む場合、または予約ヘッダー名と一致する場合は false を返す。
public
isValid(string $name, string $value) : bool
文字種のホワイトリスト検証(isValidName())は、ここではなく保存時のみ行う。 送信時にも適用すると、この検証を追加する前に保存された既存の Webhook が InvalidHeaderException で一斉に送信中止となり、稼働中の連携が黙って止まるため。
Parameters
- $name : string
- $value : string
Return values
boolisValidName()
ヘッダー名が RFC 7230 の token として妥当かどうかを検証する。
public
isValidName(string $name) : bool
空欄は isNameRequired() の責務(専用メッセージを出す)なので、ここでは妥当として扱い 二重にエラーを出さない。保存時(ACMS_POST_Webhook)からのみ呼び出す。
Parameters
- $name : string
Return values
boolcontainsCrlf()
private
containsCrlf(string $value) : bool
Parameters
- $value : string