ESA ルール言語は、HTTP リクエストから抽出された値を操作および検証する変換関数を提供します。
サポートされている変換関数
concat
文字列を連結します。
形式:
concat(String | Integer | Bytes | Array elements): String。ロジック: コンマで区切られた値のリストを 1 つの文字列に連結します。
例:
concat("String1", " ", "String", 2)は"String1 String2"を返します。concat("/archive", http.request.uri.path)は、パスセグメント"/archive"を URI パスの先頭に追加します。concat("userid=123&", http.request.uri.query)は、キーと値のペア"userid=123"を URI クエリ文字列の先頭に追加します。concat("https://www.example.com", http.request.uri.path)は、新しいホスト名と元のリクエストパスを組み合わせて、新しい URL を生成します。
ends_with
文字列が指定された部分文字列で終わるかどうかを確認します。
形式:
ends_with(source String, substring String): Boolean。ロジック:
source Stringがsubstring Stringで終わる場合はtrueを返し、それ以外の場合はfalseを返します。source Stringはフィールドである必要があります。リテラル文字列は使用できません。たとえば、ends_with("foo.html", ".html")と記述しないでください。
例:
http.request.uri.pathが"/welcome.html"の場合、ends_with(http.request.uri.path, ".html")はtrueを返します。
exists
リクエストに指定された情報が存在するかどうかを確認します。
形式:
exists(String): Boolean。ロジック: ヘッダー、Referer、User-Agent、Cookie などの一部のリクエストフィールドはオプションです。この関数は、指定されたオプション情報がクライアントリクエストに存在するかどうかを確認します。情報が存在する場合は
trueを、存在しない場合はfalseを返します。例: リクエストに
exampleという名前のヘッダーが含まれていない場合、exists(http.request.headers["example"])はfalseを返します。
len
文字列の長さを返します。
形式:
len(String): Integer。ロジック: フィールドの文字列値の文字数を返します。
例:
http.hostが"example.com"の場合、len(http.host)は11を返します。len(http.host) eq 11はtrueを返します。len(http.host) gt 11はfalseを返します。len(http.host) lt 11はfalseを返します。
lower
文字列を小文字に変換します。
形式:
lower(String): Stringロジック: フィールドの文字列値を小文字に変換します。大文字の ASCII バイトのみが変換され、他のすべてのバイトは変更されません。
例:
http.hostが"WWW.example.com"の場合、lower(http.host) == "www.example.com"はtrueを返します。
percent
指定されたフィールド値とパーセンテージのしきい値に基づいてリクエストをフィルター処理します。
形式:
percent(String | IP address, Integer): Boolean。ロジック: クライアントリクエスト内の指定されたフィールドの値に対して MD5 計算を実行し、モジュロ演算を適用して結果を 1 から 100 までの整数にマッピングします。マッピングされた値 (A) が指定された整数 (B) 以下の場合、この関数は
trueを返します。それ以外の場合はfalseを返します。注:
フィールド値が空の場合 (たとえば、リクエストに指定されたヘッダーが含まれていない場合)、ルールは有効にならず、関数は
falseを返します。2 番目のパラメーターは 1 から 100 までの整数である必要があります。
サポートされているフィールド:
ヘッダー:
http.request.headers["example"]クライアント IP アドレス:
ip.srcCookie 値:
http.request.cookies["example"]URI クエリパラメーター:
http.request.uri.args["example"]リクエストタイムスタンプ:
http.request.timestamp.sec
例:
percent(http.request.headers["example"], 80)percent(ip.src, 80)percent(http.request.cookies["example"], 80)percent(http.request.uri.args["example"], 80)percent(http.request.timestamp.sec, 80)
regex_replace
正規表現パターンに一致する部分文字列を置換します。
形式:
regex_replace(source String,regular_expression String,replacement String):String。ロジック:
正規表現に一致する最初の部分文字列を置換文字列で置き換えます。
デフォルトでは、大文字と小文字を区別してマッチングが行われます。
ソース文字列に複数のマッチが存在する場合でも、最初にマッチした文字列のみが置換されます。
置換文字列内の
$文字は、別の$文字を前に付けることでエスケープできます。置換文字列には、
${<NUMBER>}という形式で正規表現のキャプチャグループへの参照を含めることができます。ここで、<NUMBER>はキャプチャグループの番号です。${1}や${2}など、最大 8 つの参照がサポートされています。
例:
静的な文字のマッチングと置換:
文字列のマッチング成功:
regex_replace("/animal/cat", "/cat$", "/dog") == "/animal/dog"。マッチするものが見つからない場合、ソース文字列は変更されません:
異なる文字列:
regex_replace("/x", "^/y$", "/z") == "/x"。大文字と小文字を区別する文字列:
regex_replace("/cat", "^/CAT$", "/dog") == "/cat"。
複数のマッチが存在する場合、最初にマッチした文字列のみが置換されます:
regex_replace("/a/a", "/a", "/b") == "/b/a"。置換文字列内の
$文字のエスケープ:regex_replace("/b", "^/b$", "/b$$") == "/b$"。置換文字列でのキャプチャグループの使用:
regex_replace("/foo/a/path", "^/foo/([^/]*)/(.*)$", "/bar/${2}/${1}") == "/bar/path/a"。
動的フィールドのマッチングと置換:
ソース文字列は、動的フィールドを使用してクライアントリクエストからパス情報を取得します。この例では、パス内の
/cat/を/dog/に置換します:regex_replace(http.request.uri.path, "/cat/(.*)$", "/dog/${1}")。複雑な置換の例: 元のリクエストパスに 2 つの
+文字が含まれている場合に、それらを文字列%2Bに置換します:regex_replace(http.request.uri.path, "^([^+]*)\\+([^+]*)\\+(.*)$", "${1}%2B${2}%2B${3}")。
starts_with
文字列が指定された部分文字列で始まるかどうかを確認します。
形式:
starts_with(source String, substring String): Booleanロジック:
source Stringがsubstring Stringで始まる場合はtrueを返し、それ以外の場合はfalseを返します。source Stringはフィールドである必要があります。リテラル文字列は使用できません。たとえば、starts_with("foo.html", ".html")と記述しないでください。
例:
http.request.uri.pathが"/welcome.html"の場合、starts_with(http.request.uri.path, "/welcome")はtrueを返します。
to_string
値をその文字列表現に変換します。
形式:
to_string(Integer | Boolean | IP address): String。ロジック:
Integer、Boolean、またはIPアドレスの値の文字列形式を返します。例:
ip.src.asnumの結果が15169の場合、to_string(ip.src.asnum)は"15169"を返します。sslの結果がtrueの場合、to_string(ssl)は"true"を返します。ip.srcの結果が192.168.0.1の場合、to_string(ip.src)は"192.168.0.1"を返します。
upper
文字列を大文字に変換します。
形式:
upper(String): String。ロジック: フィールドの文字列値を大文字に変換します。小文字の ASCII バイトのみが変換され、他のすべてのバイトは変更されません。
例:
http.hostが"www.example.com"の場合、upper(http.host)は"WWW.EXAMPLE.COM"を返します。
wildcard_replace
ワイルドカードパターンに一致する部分文字列を置換します。
形式:
wildcard_replace(source Bytes, wildcard_pattern Bytes, replacement Bytes, flags Bytes optional): Stringロジック:
ソース文字列を 0 個以上の
*ワイルドカードを含むパターンと照合し、一致した部分を置換文字列で置き換え、結果を返します。置換文字列には、${1}や${2}など、ワイルドカードのキャプチャグループへの参照を含めることができます。最大 8 つの置換参照がサポートされています。マッチするものがない場合、この関数は元のソース文字列を返します。
sourceパラメーターはフィールドである必要があり、リテラル文字列であってはなりません。sourceの値全体がwildcard_patternパラメーターと一致する必要があり、部分一致はサポートされていません。wildcard_patternパラメーターにリテラル文字*を入力するには、\*でエスケープする必要があります。また、\文字も\\でエスケープする必要があります。**のように、エスケープされていない 2 つの*文字を連続して使用することは無効なため、使用できません。文字のエスケープを実行するには、wildcard_patternパラメーターに raw 文字列構文を使用します。replacementパラメーターにリテラル文字$を入力するには、$$でエスケープする必要があります。大文字と小文字を区別するワイルドカードマッチを実行するには、
flagsパラメーターをsに設定します。この関数はレイジーマッチを使用します。各
*は可能な限り短い文字列にマッチします。
例:
完全な 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の場合、パターンは完全な URI と一致する必要があるため、式wildcard_replace(http.request.full_uri, "/applications/*", "/apps/${1}")はhttps://example.com/applications/app1を変更せずに返します。パスのみのマッチングには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を返します。flagsパラメーターがsに設定され、大文字と小文字を区別するマッチングが有効になっています。パターンが元の URI パスと一致しないため、結果は変更されません。URI パスが
/apps/calendar/loginの場合、式wildcard_replace(http.request.uri.path, "/apps/*/login", "/${1}/login")は/calendar/loginを返します。