Cloudflare Rules 言語は、式の中で値を操作・検証する関数を提供します。
- 変換関数 は、HTTP リクエストから取り出した値を操作します。
- HMAC 検証関数 は、HMAC トークンの妥当性を調べます。有効な HMAC トークンの有無に基づいてリクエストを対象にする式を書くときに使います。
Rules 言語は、HTTP リクエストから取り出した値を変換する関数をいくつかサポートしています。よくある用途は文字列の大文字・小文字変換です。デフォルトでは文字列の評価は大文字小文字を区別します。
たとえば、lower() 関数は文字列内の大文字をすべて小文字に変換します。
次の式では、lower() 関数が http.host の値を小文字に変換し、対象値 "www.cloudflare.com" と一致するようにします。
lower(http.host) == "www.cloudflare.com"配列を引数の型として取らない変換関数には、[*] インデックス記法が必要です。詳細は 配列 を参照してください。
Rules 言語は次の変換関数をサポートしています。
any(: Array<Boolean>)Boolean
引数の比較演算子が、引数配列内のいずれかの値で true を返すときに true を返します。それ以外は false を返します。
例:
any(url_decode(http.request.body.form.values[*])[*] contains "an xss attack")all(: Array<Boolean>)Boolean
引数の比較演算子が、引数配列内のすべての値で true を返すときに true を返します。それ以外は false を返します。
例:
all(http.request.headers["content-type"][*] == "application/json")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(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.srcが113.10.0.2のとき、cidr(ip.src, 24, 24)は113.10.0.0を返します。ip.srcが2001:0000:130F:0000:0000:09C0:876A:130Bのとき、cidr(ip.src, 24, 24)は2001:0000:0000:0000:0000:0000:0000:0000を返します。
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.srcが2001:0000:130F:0000:0000:09C0:876A:130Bのとき、cidr6(ip.src, 24)は2001:0000:0000:0000:0000:0000:0000:0000を返します。ip.srcが113.10.0.2のとき、cidr6(ip.src, 24)は113.10.0.2を返します(変更なし)。
concat(: String | Bytes | Array)String | Array
カンマ区切りの値のリストを受け取ります。引数の値を 1 つの String または配列に連結します。
戻り値の型は、入力引数の型に依存します。たとえば配列を連結すると、関数は配列を返します。
たとえば、concat("String1", " ", "String", "2") は "String1 String2" を返します。
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(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(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(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(collection: : Map<T> | Array<T>, value: T)Boolean
第 2 引数で指定した value(リテラルまたは動的な値)が、第 1 引数の collection に見つかれば true を返します。それ以外は false を返します。
collection 内の値のデータ型(T で示します)は、渡した value のデータ型と一致する必要があります。さらに、T はプリミティブデータ型、つまり Boolean、Integer、String、Bytes、IP 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(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(token_configuration_id: : String)Boolean
リクエストに、ID が token_configuration_id のトークン構成に照らして有効なトークンがある場合に true を返します。
token_configuration_id は、既存の トークン構成 の ID である必要があります。リクエストにトークンがない場合、関数は false を返します。
is_jwt_valid("51231d16-01f1-48e3-93f8-91c99e81288e")len(: String | Bytes | Array)Integer
String または Bytes 値のバイト長、または配列の要素数を返します。
たとえば、http.host の値が "example.com" のとき、len(http.host) は 11 を返します。
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(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(: String)String
文字列フィールドを小文字に変換します。大文字の ASCII バイトだけが変換されます。ほかのバイトは影響を受けません。
たとえば、http.host が "WWW.cloudflare.com" のとき、lower(http.host) == "www.cloudflare.com" は true を返します。
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(: Bytes)Bytes
指定したバイトの出現をすべて除いた、新しいバイト配列を返します。
たとえば、http.host が "www.cloudflare.com" のとき、remove_bytes(http.host, "\x2e\x77") は "cloudflarecom" を返します。
remove_query_args(field : String, query_param1 String, query_param2 String, ...)String
URI クエリ文字列から 1 つ以上のクエリ文字列パラメーターを削除します。指定したパラメーターを除いた文字列を返します。
field は次のいずれかである必要があります。
http.request.uri.queryraw.http.request.uri.query
field に "search=foo&order=asc" のようなリテラル値は使えません。
remove_query_args() 関数は、指定したパラメーター(query_param1、query_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(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(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(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(field : String | Bytes, start Integer, end Integer optional)String
field 値(String または Bytes の フィールド の値)の、start バイトインデックスから end バイトインデックスまで(end は含まない)の部分を返します。field の最初のバイトのインデックスは 0 です。任意の end インデックスを省略した場合、start インデックスから文字列末尾までの部分を返します。
start と end のインデックスは負の整数にもできます。先頭ではなく末尾から文字へアクセスできます。
例:
// 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(: 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(: String)String
文字列フィールドを大文字に変換します。小文字の ASCII バイトだけが変換されます。ほかのバイトは影響を受けません。
たとえば、http.host が "www.cloudflare.com" のとき、upper(http.host) は "WWW.CLOUDFLARE.COM" を返します。
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(source : Bytes)String
指定した引数(乱数源)に基づき、ランダムな UUIDv4(Universally Unique Identifier、バージョン 4)を生成します。ランダムバイトの配列を得るには、cf.random_seed フィールドを使います。
たとえば、uuidv4(cf.random_seed) は 49887398-6bcf-485f-8899-f15dbef4d1d5 のような UUIDv4 を返します。
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を返します。
ワイルドカード一致の追加例は ワイルドカードマッチ を参照してください。
bit_slice(protocol : String, offset_start Number, offset_end Number)Number
指定したビットスライス上の一致を探します。
オフセットは指定したプロトコルヘッダーから始まります。たとえば、UDP パケットのペイロードの最初のビットに一致させるには、offset_start を 64 にする必要があります。
主に ip、udp、tcp での利用を想定しています。
スライス(offset_end – offset_start)は 32 ビットより長くできません。複数の呼び出しは論理式でつなげられます。
bit_slice のオフセットは 2,040 ビットを超えられません。
ルール式内のハッシュベースメッセージ認証コード(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() 関数のパラメーター定義は次のとおりです。
-
KeyString literal- HMAC を検証するための秘密の暗号鍵を指定します。
-
MessageMACString- 次の HMAC 要素の連結を含みます:
message、separator、timestamp、mac。定義と例は MessageMAC を参照してください。
- 次の HMAC 要素の連結を含みます:
-
ttlInteger literal- HMAC トークンの有効期間を秒で定義します。発行時点からのトークン有効期間を決めます。
-
currentTimeStampInteger- Cloudflare がリクエストを受信した UNIX タイムスタンプを秒で表します。この引数には、おおよその値として
http.request.timestamp.secフィールドを渡します。
- Cloudflare がリクエストを受信した UNIX タイムスタンプを秒で表します。この引数には、おおよその値として
-
lengthOfSeparatorInteger literaloptionalMessageMAC内のtimestampとmessageの間のseparatorの長さを指定します。バイト単位で、デフォルトは0です。
-
flagsString literaloptional-
この任意引数を
'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 は次の正規表現を満たします。
(.+)(.*)(\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 トークンの生成 を参照してください。
MessageMAC が単一フィールドにすべて含まれる場合を考えます。次の URI パスがその例です。
/download/cat.jpg?verify=1484063787-IaLGSmELTvlhfd0ItdN6PhhHTFhzx73EX8uy%2FcSDiIU%3DURI が 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 を組み立てるには、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
)