Json2TplHelper
in package
Table of Contents
Constants
- ALLOWED_CONTENT_TYPES = ['application/json', 'text/json', 'text/plain', 'application/javascript', 'text/javascript']
- 許可する Content-Type(メディアタイプ部分のみで比較)
- DEFAULT_MAX_CONTENT_LENGTH = 5 * 1024 * 1024
- レスポンスボディの許容最大サイズ(byte)の既定値。.env の JSON2TPL_MAX_CONTENT_LENGTH で変更できる
- DEFAULT_MAX_REDIRECTS = 5
- 追跡を許可するリダイレクト回数の上限の既定値。.env の JSON2TPL_MAX_REDIRECTS で変更できる
Properties
- $allowedLocalDirs : array<string|int, string>
- ローカル取得を許可するディレクトリ一覧
- $filesystem : Filesystem
- $httpFetcher : callable(string, array<string|int, string>): array{statusCode: int, contentType: ?string, location: ?string, body: string}
- HTTP(S) URI を取得するフェッチャー
- $maxContentLength : int
- レスポンスボディの許容最大サイズ(byte)
- $maxRedirects : int
- 追跡を許可するリダイレクト回数の上限
- $ssrfGuard : SsrfGuard
- 取得先が内部/予約済みアドレスを指していないか検証するガード
Methods
- __construct() : mixed
- getContents() : string
- urlからコンテンツの取得
- getJsonCache() : string|bool
- キャッシュの取得
- isVector() : bool
- 添え字が0から連続する数値(=配列とみなせる)ときにtrue
- resolveAllowedLocalDirsFromEnv() : array<string|int, string>
- saveCache() : mixed
- キャッシュの保存
- assertSafeContentType() : void
- Content-Type がJSON/テキスト系として許可されたものか検証する
- assertSafeRemoteUri() : array<string|int, string>
- SSRF対策として、URIのホストが内部/プライベートアドレスを指していないか検証する
- fetchHttpByCurl() : array{statusCode: int, contentType: ?string, location: ?string, body: string}
- curl で HTTP(S) コンテンツを取得する既定のフェッチャー
- getCacheId() : string
- キャッシュidの取得
- getHttpContents() : string
- HTTP(S) URI からコンテンツを取得する
- getLocalContents() : string
- 許可ディレクトリ配下のローカルファイルを読み込む
- getLogEndpoint() : string
- ログに出力する外部エンドポイントを返す。
- getRawContents() : string
- スキームに応じてローカル/HTTP(S)取得に振り分ける
- resolveMaxContentLengthFromEnv() : int
- resolveMaxRedirectsFromEnv() : int
- resolveRedirectUri() : string
- リダイレクト元URIとLocationヘッダの値から絶対URIを組み立てる
- resolveSsrfWhiteListFromEnv() : array<string|int, string>
Constants
ALLOWED_CONTENT_TYPES
許可する Content-Type(メディアタイプ部分のみで比較)
private
mixed
ALLOWED_CONTENT_TYPES
= ['application/json', 'text/json', 'text/plain', 'application/javascript', 'text/javascript']
DEFAULT_MAX_CONTENT_LENGTH
レスポンスボディの許容最大サイズ(byte)の既定値。.env の JSON2TPL_MAX_CONTENT_LENGTH で変更できる
private
mixed
DEFAULT_MAX_CONTENT_LENGTH
= 5 * 1024 * 1024
DEFAULT_MAX_REDIRECTS
追跡を許可するリダイレクト回数の上限の既定値。.env の JSON2TPL_MAX_REDIRECTS で変更できる
private
mixed
DEFAULT_MAX_REDIRECTS
= 5
Properties
$allowedLocalDirs
ローカル取得を許可するディレクトリ一覧
private
array<string|int, string>
$allowedLocalDirs
$filesystem
private
Filesystem
$filesystem
$httpFetcher
HTTP(S) URI を取得するフェッチャー
private
callable(string, array<string|int, string>): array{statusCode: int, contentType: ?string, location: ?string, body: string}
$httpFetcher
$maxContentLength
レスポンスボディの許容最大サイズ(byte)
private
int
$maxContentLength
$maxRedirects
追跡を許可するリダイレクト回数の上限
private
int
$maxRedirects
$ssrfGuard
取得先が内部/予約済みアドレスを指していないか検証するガード
private
SsrfGuard
$ssrfGuard
Methods
__construct()
public
__construct([array<string|int, string>|null $allowedLocalDirs = null ][, Filesystem|null $filesystem = null ][, callable(string): array<string|int, string>|null $dnsResolver = null ][, callable(string, array<string|int, string>): array{statusCode: int, contentType: ?string, location: ?string, body: string}|null $httpFetcher = null ][, int|null $maxContentLength = null ][, int|null $maxRedirects = null ][, array<string|int, string>|null $ssrfWhiteList = null ]) : mixed
Parameters
- $allowedLocalDirs : array<string|int, string>|null = null
-
ローカル取得を許可するディレクトリ一覧。null の場合 THEMES_DIR と .env の JSON2TPL_LOCAL_WHITE_LIST から解決する
- $filesystem : Filesystem|null = null
- $dnsResolver : callable(string): array<string|int, string>|null = null
-
ホスト名から IP アドレス一覧を解決するリゾルバ(テスト時の差し替え用)。null の場合 DNS 解決を行う既定実装を使う
- $httpFetcher : callable(string, array<string|int, string>): array{statusCode: int, contentType: ?string, location: ?string, body: string}|null = null
-
HTTP(S) URI を取得するフェッチャー(テスト時の差し替え用)。null の場合 curl による既定実装を使う
- $maxContentLength : int|null = null
-
レスポンスボディの許容最大サイズ(byte)。null の場合 .env の JSON2TPL_MAX_CONTENT_LENGTH から解決する
- $maxRedirects : int|null = null
-
追跡を許可するリダイレクト回数の上限。null の場合 .env の JSON2TPL_MAX_REDIRECTS から解決する
- $ssrfWhiteList : array<string|int, string>|null = null
-
SSRFガードを免除する IP アドレス/CIDR 一覧。null の場合 .env の JSON2TPL_SSRF_WHITE_LIST から解決する
getContents()
urlからコンテンツの取得
public
getContents(string $uri) : string
Parameters
- $uri : string
Return values
stringgetJsonCache()
キャッシュの取得
public
getJsonCache(string $uri) : string|bool
Parameters
- $uri : string
Return values
string|boolisVector()
添え字が0から連続する数値(=配列とみなせる)ときにtrue
public
isVector(array<string|int, mixed> $ary) : bool
Parameters
- $ary : array<string|int, mixed>
Return values
boolresolveAllowedLocalDirsFromEnv()
public
static resolveAllowedLocalDirsFromEnv() : array<string|int, string>
.env の JSON2TPL_LOCAL_WHITE_LIST(カンマ区切り)から追加の許可ディレクトリを組み立てる
ACMS_ValidatorBody::json2TplSource() が保存時バリデーションで同じ許可 ディレクトリ一覧を参照するため public にしている。
Return values
array<string|int, string>saveCache()
キャッシュの保存
public
saveCache(string $uri, string $contents[, int $expire = 0 ]) : mixed
Parameters
- $uri : string
- $contents : string
- $expire : int = 0
assertSafeContentType()
Content-Type がJSON/テキスト系として許可されたものか検証する
private
assertSafeContentType(string|null $contentType) : void
Parameters
- $contentType : string|null
assertSafeRemoteUri()
SSRF対策として、URIのホストが内部/プライベートアドレスを指していないか検証する
private
assertSafeRemoteUri(string $uri) : array<string|int, string>
Parameters
- $uri : string
Return values
array<string|int, string> —検証を通った IP アドレス一覧(接続のピンニングに使う)
fetchHttpByCurl()
curl で HTTP(S) コンテンツを取得する既定のフェッチャー
private
fetchHttpByCurl(string $uri[, array<string|int, string> $pinnedIpAddresses = [] ]) : array{statusCode: int, contentType: ?string, location: ?string, body: string}
Parameters
- $uri : string
- $pinnedIpAddresses : array<string|int, string> = []
-
接続を固定する検証済み IP アドレス一覧(DNS ピンニング)
Return values
array{statusCode: int, contentType: ?string, location: ?string, body: string}getCacheId()
キャッシュidの取得
private
getCacheId(string $uri) : string
Parameters
- $uri : string
Return values
stringgetHttpContents()
HTTP(S) URI からコンテンツを取得する
private
getHttpContents(string $uri) : string
リダイレクトは自動追従(CURLOPT_FOLLOWLOCATION)せず、ホップごとに assertSafeRemoteUri() を再適用することで、安全なURLから内部アドレスへ 誘導するリダイレクトSSRFを防ぐ。
Parameters
- $uri : string
Return values
stringgetLocalContents()
許可ディレクトリ配下のローカルファイルを読み込む
private
getLocalContents(string $uri) : string
Parameters
- $uri : string
Return values
stringgetLogEndpoint()
ログに出力する外部エンドポイントを返す。
private
getLogEndpoint(string $uri) : string
Parameters
- $uri : string
Return values
stringgetRawContents()
スキームに応じてローカル/HTTP(S)取得に振り分ける
private
getRawContents(string $uri) : string
Parameters
- $uri : string
Return values
stringresolveMaxContentLengthFromEnv()
private
static resolveMaxContentLengthFromEnv() : int
.env の JSON2TPL_MAX_CONTENT_LENGTH からレスポンスボディの許容最大サイズ(byte)を解決する
Return values
intresolveMaxRedirectsFromEnv()
private
static resolveMaxRedirectsFromEnv() : int
.env の JSON2TPL_MAX_REDIRECTS から追跡を許可するリダイレクト回数の上限を解決する
Return values
intresolveRedirectUri()
リダイレクト元URIとLocationヘッダの値から絶対URIを組み立てる
private
resolveRedirectUri(string $baseUri, string $location) : string
Parameters
- $baseUri : string
- $location : string
Return values
stringresolveSsrfWhiteListFromEnv()
private
static resolveSsrfWhiteListFromEnv() : array<string|int, string>
.env の JSON2TPL_SSRF_WHITE_LIST(カンマ区切り、IPアドレスまたはCIDR表記)から SSRFガードを免除するIPアドレス/CIDR一覧を組み立てる
ACMS_SSRF_WHITE_LIST(全経路共通の許可リスト)も併せて読み、両方の和を返す。