Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

関数

最終更新 Markdown で表示Agent セットアップ

Cloudflare Rules 言語は、式の中で値を操作・検証する関数を提供します。

  • 変換関数 は、HTTP リクエストから取り出した値を操作します。
  • HMAC 検証関数 は、HMAC トークンの妥当性を調べます。有効な HMAC トークンの有無に基づいてリクエストを対象にする式を書くときに使います。

変換関数

Rules 言語は、HTTP リクエストから取り出した値を変換する関数をいくつかサポートしています。よくある用途は文字列の大文字・小文字変換です。デフォルトでは文字列の評価は大文字小文字を区別します。

たとえば、lower() 関数は文字列内の大文字をすべて小文字に変換します。

次の式では、lower() 関数が http.host の値を小文字に変換し、対象値 "www.cloudflare.com" と一致するようにします。

lower(http.host) == "www.cloudflare.com"

配列を引数の型として取らない変換関数には、[*] インデックス記法が必要です。詳細は 配列 を参照してください。

Rules 言語は次の変換関数をサポートしています。

any

any(Array<Boolean>): Boolean

引数の比較演算子が、引数配列内のいずれかの値で true を返すときに true を返します。それ以外は false を返します。

例:

any(url_decode(http.request.body.form.values[*])[*] contains "an xss attack")

all

all(Array<Boolean>): Boolean

引数の比較演算子が、引数配列内のすべての値で true を返すときに true を返します。それ以外は false を返します。

例:

all(http.request.headers["content-type"][*] == "application/json")

encode_base64

encode_base64(input String | Bytes [, flags String]): String

input の文字列またはバイト配列を Base64 形式にエンコードします。

flags パラメーターは任意です。1 つ以上のフラグを単一の文字列として渡せます。利用できるフラグは次のとおりです。

  • u: URL セーフな Base64 エンコードを使います(+/ の代わりに -_ を使います)。
  • p: パディングを追加します(一部のシステムで必要なように、出力長が 4 の倍数になるよう = を末尾に付けます)。

デフォルトでは、パディングなしの標準 Base64 エンコードを使います。

例:

encode_base64("hello world")          will return "aGVsbG8gd29ybGQ"
encode_base64("hello world", "p")     will return "aGVsbG8gd29ybGQ="
encode_base64("hello world", "u")     will return "aGVsbG8gd29ybGQ"
encode_base64("hello world", "up")    will return "aGVsbG8gd29ybGQ="

encode_base64() を他の関数と組み合わせて、署名付きリクエストヘッダーを作成できます。

encode_base64(sha256(concat(to_string(ip.src), http.host, "my-secret")))

cidr

cidr(address IP address, ipv4_network_bits Integer, ipv6_network_bits Integer): IP address

指定した IPv4 および IPv6 のネットワークビット(対応するネットマスクを決めます)に基づき、IP アドレス(IPv4 または IPv6)に対応するネットワークアドレスを返します。

address パラメーターはフィールドである必要があります。つまり、リテラルの String は使えません。

ipv4_network_bits の値は 1 から 32、ipv6_network_bits の値は 1 から 128 である必要があります。

例:

  • ip.src113.10.0.2 のとき、cidr(ip.src, 24, 24)113.10.0.0 を返します。
  • ip.src2001:0000:130F:0000:0000:09C0:876A:130B のとき、cidr(ip.src, 24, 24)2001:0000:0000:0000:0000:0000:0000:0000 を返します。

cidr6

cidr6(address IP address, ipv6_network_bits Integer): IP address

指定したネットワークビット(ネットマスクを決めます)に基づき、IPv6 アドレスに対応する IPv6 ネットワークアドレスを返します。最初のパラメーターに IPv4 アドレスを渡した場合は、そのまま返します。

address パラメーターはフィールドである必要があります。つまり、リテラルの String は使えません。

ipv6_network_bits の値は 1 から 128 である必要があります。

この関数は cidr(<address>, 32, <ipv6_network_bits>) と同等です。

例:

  • ip.src2001:0000:130F:0000:0000:09C0:876A:130B のとき、cidr6(ip.src, 24)2001:0000:0000:0000:0000:0000:0000:0000 を返します。
  • ip.src113.10.0.2 のとき、cidr6(ip.src, 24)113.10.0.2 を返します(変更なし)。

concat

concat(String | Bytes | Array): String | Array

カンマ区切りの値のリストを受け取ります。引数の値を 1 つの String または配列に連結します。

戻り値の型は、入力引数の型に依存します。たとえば配列を連結すると、関数は配列を返します。

たとえば、concat("String1", " ", "String", "2")"String1 String2" を返します。

decode_base64

decode_base64(source String): String

source で指定した Base64 エンコード済み String をデコードします。

source はフィールドである必要があります。つまり、リテラルの String は使えません。

たとえば、次の HTTP リクエストヘッダーがある場合: client_id: MTIzYWJj(any(decode_base64(http.request.headers["client_id"][*])[*] eq "123abc"))true を返します。

ends_with

ends_with(source String, substring String): Boolean

source が指定した部分文字列で終わるときに true を返します。それ以外は false を返します。source にリテラル値("foo" など)は使えません。

たとえば、http.request.uri.path"/welcome.html" のとき、ends_with(http.request.uri.path, ".html")true を返します。

join

join(items Array<String>, separator String): String

items 内の文字列を、各項目の間に separator を挟んで連結した文字列を返します。

いずれかの引数が nil の場合、戻り値は nil になります。
items 配列が空の場合、戻り値は空文字列になります。
items 配列に項目が 1 つだけの場合、連結は行われず、その(単一の)項目がそのまま返されます。

この関数は split() 関数の逆です。

例:

# Joins all HTTP request header names into a single string, with names separated by commas
join(http.request.headers.names, ",")

has_key

has_key(map: Map<T>, key: String): Boolean

第 2 引数で指定した key(リテラルまたは動的な文字列)が、第 1 引数の map に存在するキーであれば true を返します。それ以外は false を返します。

map 内の値のデータ型(T で示します)は任意の型にできます。

いずれかの引数が nil の場合、戻り値は nil になります。

例:

# Check if an HTTP request header exists:
has_key(http.request.headers, "x-my-header")

# Check if a request header exists based on the name of the first query argument:
has_key(http.request.headers, lower(http.request.uri.args.names[0]))

has_value

has_value(collection: Map<T> | Array<T>, value: T): Boolean

第 2 引数で指定した value(リテラルまたは動的な値)が、第 1 引数の collection に見つかれば true を返します。それ以外は false を返します。

collection 内の値のデータ型(T で示します)は、渡した value のデータ型と一致する必要があります。さらに、T はプリミティブデータ型、つまり BooleanIntegerStringBytesIP address のいずれかである必要があります。

いずれかの引数が nil の場合、戻り値は nil になります。

例:

# Check if there is an HTTP request header with the exact name 'X-My-Header'
has_value(http.request.headers.names, "X-My-Header")

# Check if there is a request header with the exact name provided as the first query argument:
has_value(http.request.headers.names, http.request.uri.args.names[0])

is_jwt_present

is_jwt_present(token_configuration_id: String): Boolean

リクエストに、ID が token_configuration_id のトークン構成どおりのトークンがある場合に true を返します。

token_configuration_id は、既存の トークン構成 の ID である必要があります。

例:

is_jwt_present("51231d16-01f1-48e3-93f8-91c99e81288e")

is_jwt_valid

is_jwt_valid(token_configuration_id: String): Boolean

リクエストに、ID が token_configuration_id のトークン構成に照らして有効なトークンがある場合に true を返します。

token_configuration_id は、既存の トークン構成 の ID である必要があります。リクエストにトークンがない場合、関数は false を返します。

is_jwt_valid("51231d16-01f1-48e3-93f8-91c99e81288e")

len

len(String | Bytes | Array): Integer

String または Bytes 値のバイト長、または配列の要素数を返します。

たとえば、http.host の値が "example.com" のとき、len(http.host)11 を返します。

lookup_json_integer

lookup_json_integer(field String, key String | Integer, key String | Integer optional, ...): Integer

field 内で指定した key に関連付けられた整数値を返します。

field は、有効な JSON ドキュメントの文字列表現である必要があります。

key は、属性名、JSON 配列内の 0 始まりの位置番号、またはこの 2 つの組み合わせ(追加の関数パラメーターとして)にできます。JSON ドキュメントの階層に従って、特定の整数値を取得します。

注意: この関数はプレーンな整数にだけ動作します。たとえば、42.0 のように小数部が 0 の浮動小数点数では動作しません。

例:

  • http.request.body.raw フィールドに次の JSON オブジェクトがある場合:
    { "record_id": "aed53a", "version": 2 }
    lookup_json_integer(http.request.body.raw, "version")2 を返します。

  • 次の入れ子オブジェクトがある場合:
    { "product": { "id": 356 } }
    lookup_json_integer(http.request.body.raw, "product", "id")356 を返します。

  • ルートレベルに次の JSON 配列がある場合:
    ["first_item", -234]
    lookup_json_integer(http.request.body.raw, 1)-234 を返します。

  • JSON オブジェクト属性内に次の配列がある場合:
    { "network_ids": [123, 456] }
    lookup_json_integer(http.request.body.raw, "network_ids", 0)123 を返します。

  • ルートレベルに次の JSON オブジェクト配列がある場合:
    [{ "product_id": 123 }, { "product_id": 456 }]
    lookup_json_integer(http.request.body.raw, 1, "product_id")456 を返します。

lookup_json_string

lookup_json_string(field String, key String | Integer, key String | Integer optional, ...): String

field 内で指定した key に関連付けられた文字列値を返します。

field は、有効な JSON ドキュメントの文字列表現である必要があります。

key は、属性名、JSON 配列内の 0 始まりの位置番号、またはこの 2 つの組み合わせ(追加の関数パラメーターとして)にできます。JSON ドキュメントの階層に従って、特定の値を取得します。

例:

  • http.request.body.raw フィールドに次の JSON オブジェクトがある場合:
    { "company": "cloudflare", "product": "rulesets" }
    lookup_json_string(http.request.body.raw, "company") == "cloudflare"true を返します。

  • 次の入れ子オブジェクトがある場合:
    { "network": { "name": "cloudflare" } }
    lookup_json_string(http.request.body.raw, "network", "name") == "cloudflare"true を返します。

  • ルートレベルに次の JSON 配列がある場合:
    ["other_company", "cloudflare"]
    lookup_json_string(http.request.body.raw, 1) == "cloudflare"true を返します。

  • JSON オブジェクト属性内に次の配列がある場合:
    { "networks": ["other_company", "cloudflare"] }
    lookup_json_string(http.request.body.raw, "networks", 1) == "cloudflare"true を返します。

  • ルートレベルに次の JSON オブジェクト配列がある場合:
    [{ "network": "other_company" }, { "network": "cloudflare" }]
    lookup_json_string(http.request.body.raw, 1, "network") == "cloudflare"true を返します。

lower

lower(String): String

文字列フィールドを小文字に変換します。大文字の ASCII バイトだけが変換されます。ほかのバイトは影響を受けません。

たとえば、http.host"WWW.cloudflare.com" のとき、lower(http.host) == "www.cloudflare.com"true を返します。

regex_replace

regex_replace(source String, regular_expression String, replacement String): String

正規表現に一致したソース文字列の一部を置換文字列で置き換え、結果を返します。置換文字列には、正規表現のキャプチャグループへの参照(${1}${2} など)を最大 8 つ含められます。

例:

  • リテラル一致の置換:
    regex_replace("/foo/bar", "/bar$", "/baz") == "/foo/baz"

  • 一致がない場合、入力文字列は変わりません:
    regex_replace("/x", "^/y$", "/mumble") == "/x"

  • 一致はデフォルトで大文字小文字を区別します:
    regex_replace("/foo", "^/FOO$", "/x") == "/foo"

  • 複数一致がある場合、置換は 1 回だけ(最初の一致)行われます:
    regex_replace("/a/a", "/a", "/b") == "/b/a"

  • 置換文字列内の $ は、もう 1 つの $ を前置してエスケープします:
    regex_replace("/b", "^/b$", "/b$$") == "/b$"

  • キャプチャグループによる置換:
    regex_replace("/foo/a/path", "^/foo/([^/]*)/(.*)$", "/bar/${2}/${1}") == "/bar/path/a/"

正規表現の一部を括弧で囲むとキャプチャグループを作れます。置換文字列では ${<NUMBER>} でキャプチャグループを参照します。<NUMBER> はキャプチャグループの番号です。

regex_replace() 関数は 1 つの式で 1 回だけ使え、wildcard_replace() 関数と入れ子にはできません。

remove_bytes

remove_bytes(Bytes): Bytes

指定したバイトの出現をすべて除いた、新しいバイト配列を返します。

たとえば、http.host"www.cloudflare.com" のとき、remove_bytes(http.host, "\x2e\x77")"cloudflarecom" を返します。

remove_query_args

remove_query_args(field String, query_param1 String, query_param2 String, ...): String

URI クエリ文字列から 1 つ以上のクエリ文字列パラメーターを削除します。指定したパラメーターを除いた文字列を返します。

field は次のいずれかである必要があります。

  • http.request.uri.query
  • raw.http.request.uri.query

field"search=foo&order=asc" のようなリテラル値は使えません。

remove_query_args() 関数は、指定したパラメーター(query_param1query_param2 など)を、同じパラメーターの繰り返しを含めてすべて削除します。

影響を受けないクエリパラメーターの順序は保持されます。

例:

// If http.request.uri.query is "order=asc&country=GB":

remove_query_args(http.request.uri.query, "country")  will return "order=asc"
remove_query_args(http.request.uri.query, "order")    will return "country=GB"
remove_query_args(http.request.uri.query, "search")   will return "order=asc&country=GB" (unchanged)

// If http.request.uri.query is "category=Foo&order=desc&category=Bar":

remove_query_args(http.request.uri.query, "order")    will return "category=Foo&category=Bar"
remove_query_args(http.request.uri.query, "category") will return "order=desc"

sha256

sha256(input String | Bytes): Bytes

input の文字列またはバイト配列の SHA-256 暗号学的ハッシュを計算します。32 バイトのハッシュ値を返します。

署名付きリクエストヘッダーの生成、リクエスト整合性の検証、ルール式内でのセキュアトークン作成に使います。

例:

sha256("my-token")

上の例は、オリジンがリクエストを認証するために検証できる 32 バイトのハッシュを返します。

sha256()encode_base64() と組み合わせて、Base64 エンコード済み署名を作成できます。

encode_base64(sha256("my-token"))

リクエスト属性から署名付きヘッダー値を作成するには、次のようにします。

encode_base64(sha256(concat(to_string(ip.src), to_string(http.request.timestamp.sec), "my-secret-key")))

split

split(input String, separator String, limit Integer): Array<String>

input 文字列を、separator 文字列の出現ごとに分割して文字列の配列にします。戻り値の配列には最大 limit 個の要素が含まれます。

limit が分割後の部分文字列の実際の数より小さい場合、戻り値配列の最後の要素に残りの文字列が含まれます。

separator は空でないリテラル文字列である必要があります。

limit は必須で、1 から 128 のリテラル整数である必要があります。

input が nil の場合、戻り値は nil になります。

この関数は join() 関数の逆です。

例:

# Split a comma-separated list of categories obtained from an HTTP request header.

# A) Consider the following HTTP request header:
x-categories: groceries,electronics,diy,auto

split(http.request.headers["x-categories"][0], ",", 64)  will return ["groceries", "electronics", "diy", "auto"]
split(http.request.headers["x-categories"][0], ",", 3)   will return ["groceries", "electronics", "diy,auto"]

# B) Consider the following HTTP request header:
x-categories: groceries,,electronics

split(http.request.headers["x-categories"][0], ",", 64)  will return ["groceries", "", "electronics"]

starts_with

starts_with(source String, substring String): Boolean

source が指定した部分文字列で始まるときに true を返します。それ以外は false を返します。source にリテラル値("foo" など)は使えません。

たとえば、http.request.uri.path"/blog/first-post" のとき、starts_with(http.request.uri.path, "/blog")true を返します。

substring

substring(field String | Bytes, start Integer, end Integer optional): String

field 値(String または Bytes の フィールド の値)の、start バイトインデックスから end バイトインデックスまで(end は含まない)の部分を返します。field の最初のバイトのインデックスは 0 です。任意の end インデックスを省略した場合、start インデックスから文字列末尾までの部分を返します。

startend のインデックスは負の整数にもできます。先頭ではなく末尾から文字へアクセスできます。

例:

// If http.request.body.raw is "asdfghjk":

substring(http.request.body.raw, 2, 5)   will return "dfg"
substring(http.request.body.raw, 2)      will return "dfghjk"
substring(http.request.body.raw, -2)     will return "jk"
substring(http.request.body.raw, 0, -2)  will return "asdfgh"

to_string

to_string(Integer | Boolean | IP address): String

Integer、Boolean、または IP address 値の文字列表現を返します。

例:

// If cf.bot_management.score is 5:
to_string(cf.bot_management.score)   will return "5"

// If ssl is true:
to_string(ssl)                       will return "true"

upper

upper(String): String

文字列フィールドを大文字に変換します。小文字の ASCII バイトだけが変換されます。ほかのバイトは影響を受けません。

たとえば、http.host"www.cloudflare.com" のとき、upper(http.host)"WWW.CLOUDFLARE.COM" を返します。

url_decode

url_decode(source String, options String optional): String

source で定義した URL 形式の文字列をデコードします。次のとおりです。

  • %20+ はスペース文字( )にデコードされます。

  • %E4%BDä½ にデコードされます。

source はフィールドである必要があります。つまり、リテラル文字列は使えません。

options パラメーターは任意です。オプションは引用符で囲んだ単一の文字列として渡します。例: "r" または "ur"。利用できるオプションは次のとおりです。

  • r: 再帰的なデコードを適用します。たとえば、%2520 は 2 回(再帰的に)デコードされ、スペース文字( )になります。
  • u: Unicode パーセントデコードを有効にします。結果は UTF-8 でエンコードされます。たとえば、"%u2601" はクラウド絵文字(☁️)の UTF-8 エンコード("\xe2\x98\x81"、3 バイト)にデコードされます。

例:

url_decode("John%20Doe")   will return "John Doe"
url_decode("John+Doe")     will return "John Doe"
url_decode("%2520")        will return "%20"
url_decode("%2520", "r")   will return " "

// Using url_decode() with the any() function:
any(url_decode(http.request.body.form.values[*])[*] contains "an xss attack")

// Using the u option to match a specific alphabet
url_decode(http.request.uri.path) matches "(?u)\p{Hangul}+"

uuidv4

uuidv4(source Bytes): String

指定した引数(乱数源)に基づき、ランダムな UUIDv4(Universally Unique Identifier、バージョン 4)を生成します。ランダムバイトの配列を得るには、cf.random_seed フィールドを使います。

たとえば、uuidv4(cf.random_seed)49887398-6bcf-485f-8899-f15dbef4d1d5 のような UUIDv4 を返します。

wildcard_replace

wildcard_replace(source Bytes, wildcard_pattern Bytes, replacement Bytes, flags Bytes optional): String

0 個以上の * ワイルドカードメタ文字を含むリテラルで一致した source 文字列を、置換文字列で置き換え、結果を返します。置換文字列には、ワイルドカードキャプチャグループへの参照(${1}${2} など)を最大 8 つ含められます。

一致がない場合、関数は source を変更せずに返します。

source パラメーターはフィールドである必要があります(リテラル文字列は使えません)。さらに、source 値全体が wildcard_pattern パラメーターに一致する必要があります(フィールド値の一部だけ一致してはいけません)。

wildcard_pattern パラメーターにリテラルの * を入れるには、\* でエスケープする必要があります。さらに、\\\ でエスケープする必要があります。このパラメーターでエスケープされていない * が 2 つ続く(**)のは無効で使えません。文字のエスケープが必要な場合は、wildcard_pattern パラメーターに raw 文字列構文 を使うことを推奨します。

replacement パラメーターにリテラルの $ を入れるには、$$ でエスケープする必要があります。

大文字小文字を区別するワイルドカード一致を行うには、flags パラメーターを "s" にします。

この関数は遅延一致を使います。つまり、各 * メタ文字をできるだけ短い文字列に一致させようとします。

wildcard_replace() 関数は 1 つの式で 1 回だけ使え、regex_replace() 関数と入れ子にはできません。

例:

  • 完全な URI が https://apps.example.com/calendar/admin?expand=true のとき、
    wildcard_replace(http.request.full_uri, "https://*.example.com/*/*", "https://example.com/${1}/${2}/${3}")https://example.com/apps/calendar/admin?expand=true を返します

  • 完全な URI が https://example.com/applications/app1 のとき、
    wildcard_replace(http.request.full_uri, "/applications/*", "/apps/${1}")https://example.com/applications/app1 を返します(完全な URI 値に一致がないため変更なし。URI パスの一致には http.request.uri.path フィールドを使う必要があります)。

  • URI パスが /calendar のとき、
    wildcard_replace(http.request.uri.path, "/*", "/apps/${1}")/apps/calendar を返します。

  • URI パスが /Apps/calendar のとき、
    wildcard_replace(http.request.uri.path, "/apps/*", "/${1}")/calendar を返します(デフォルトでは大文字小文字を区別しません)。

  • URI パスが /Apps/calendar のとき、
    wildcard_replace(http.request.uri.path, "/apps/*", "/${1}", "s")/Apps/calendar を返します(大文字小文字を区別する一致がないため変更なし)。

  • URI パスが /apps/calendar/login のとき、
    wildcard_replace(http.request.uri.path, "/apps/*/login", "/${1}/login")/calendar/login を返します。

ワイルドカード一致の追加例は ワイルドカードマッチ を参照してください。

Cloudflare Network Firewall の関数

bit_slice

bit_slice(protocol String, offset_start Number, offset_end Number): Number

指定したビットスライス上の一致を探します。

オフセットは指定したプロトコルヘッダーから始まります。たとえば、UDP パケットのペイロードの最初のビットに一致させるには、offset_start64 にする必要があります。

主に ipudptcp での利用を想定しています。

スライス(offset_endoffset_start)は 32 ビットより長くできません。複数の呼び出しは論理式でつなげられます。

bit_slice のオフセットは 2,040 ビットを超えられません。

HMAC 検証

概要

ルール式内のハッシュベースメッセージ認証コード(HMAC)トークンは、is_timed_hmac_valid_v0() 関数で検証できます。シグネチャは次のとおりです。

is_timed_hmac_valid_v0(
  <String literal as Key>,
  <String field as MessageMAC>,
  <Integer literal as ttl>,
  <Integer as currentTimeStamp>,
  <Optional Integer literal as lengthOfSeparator, default: 0>,
  <Optional String literal as flags>
) -> <Bool as result>

is_timed_hmac_valid_v0() 関数のパラメーター定義は次のとおりです。

  • Key String literal

    • HMAC を検証するための秘密の暗号鍵を指定します。
  • MessageMAC String

    • 次の HMAC 要素の連結を含みます: messageseparatortimestampmac。定義と例は MessageMAC を参照してください。
  • ttl Integer literal

    • HMAC トークンの有効期間を秒で定義します。発行時点からのトークン有効期間を決めます。
  • currentTimeStamp Integer

    • Cloudflare がリクエストを受信した UNIX タイムスタンプを秒で表します。この引数には、おおよその値として http.request.timestamp.sec フィールドを渡します。
  • lengthOfSeparator Integer literal optional

    • MessageMAC 内の timestampmessage の間の separator の長さを指定します。バイト単位で、デフォルトは 0 です。
  • flags String literal optional

    • この任意引数を 's' にすると、関数は MessageMAC 引数内の Base64 エンコード済み mac が、パディングなしの URL セーフ文字セットを使うことを期待します。

    • flags の値を 's'しない場合、MessageMAC 引数内の mac の Base64 値を URL エンコードする必要があります。

使い方

is_timed_hmac_valid_v0() 関数は、渡された Key を使い、MessageMAC の message 領域と timestamp 領域からメッセージ認証コード(MAC)を生成します。生成した MAC が MessageMAC の mac 領域と一致し、トークンが期限切れでなければ、HMAC は有効で関数は true を返します。

たとえば、次の式は、有効な HMAC トークンを含まない downloads.example.com へのリクエストに一致します。

http.host == "downloads.example.com"
and not is_timed_hmac_valid_v0("mysecretkey", http.request.uri, 100000, http.request.timestamp.sec, 8)

HMAC 検証を使うルールの例は、WAF ドキュメントの トークン認証を設定する を参照してください。

MessageMAC

有効な MessageMAC は次の正規表現を満たします。

(.+)(.*)(\d{10})-(.{43,})

括弧で区切られた次の式で構成されます。

説明
(.+) 検証する message /download/cat.jpg
(.*) メッセージとタイムスタンプの間の separator。一般的にはパラメーター名です。 &verify=
(\d{10}) MAC が発行された 10 桁の UNIX timestamp(秒)。 1484063137
(.{43,}) Base64 エンコード済みの mac。HMAC 検証関数の urlSafe 引数を 's' にしない場合、mac の Base64 値を URL エンコードする必要があります。Base64 MAC エンコードが URL セーフな場合、mac 値は 43 バイトです。それ以外は URL エンコードのため 44 バイト以上になります。 IaLGSmELTvlhfd0ItdN6PhhHTFhzx73EX8uy%2FcSDiIU%3D

MessageMAC の生成手順は HMAC トークンの生成 を参照してください。

HMAC 検証の例

単一フィールド内の MessageMAC

MessageMAC が単一フィールドにすべて含まれる場合を考えます。次の URI パスがその例です。

/download/cat.jpg?verify=1484063787-IaLGSmELTvlhfd0ItdN6PhhHTFhzx73EX8uy%2FcSDiIU%3D

URI が MessageMAC の各要素にどう対応するかを示します。

要素
message /download/cat.jpg
separator ?verify=(長さ 8
timestamp 1484063787
mac IaLGSmELTvlhfd0ItdN6PhhHTFhzx73EX8uy%2FcSDiIU%3D

MessageMAC が http.request.uri のような単一フィールドにすべて含まれる場合、HMAC 検証関数の MessageMAC 引数にフィールド名を渡します。

is_timed_hmac_valid_v0(
  "mysecretkey",
  http.request.uri,
  100000,
  http.request.timestamp.sec,
  8
)

連結した MessageMAC 引数

複数フィールドから MessageMAC を組み立てるには、concat() 関数を使います。

この例は、リクエスト URI と 2 つのヘッダーフィールドを連結して MessageMAC 引数の値を構築します。

is_timed_hmac_valid_v0(
  "mysecretkey",
  concat(
    http.request.uri,
    http.request.headers["timestamp"][0],
    "-",
    http.request.headers["mac"][0]),
  100000,
  http.request.timestamp.sec,
  0
)

役に立ちましたか?