次の方法で共有


不正アクセスの言語リファレンス

Microsoft Dynamics 365 には、不正行為戦略を定義して表現するのに役立つ、独自の豊富で表現力豊かな言語があります。 この言語は C# と SQL と多くの類似点を持ち、独自のビジネス シナリオで不正行為に対処するために必要な柔軟性を提供するように設計されています。

現在、この言語を使用して、ルールと速度を定義できます。 詳細については、「管理ルールパフォーマンス チェックを参照してください。

この不正言語リファレンス ガイドには、言語を構成する演算子、関数、ステートメントの完全な一覧が含まれています。

ステートメント

ステートメントの構文 説明
LET <VariableName> = <Expression>

LET ステートメントを使用して、新しい変数を定義します。 変数のスコープは、変数が定義されているルールまたは速度セットです。 変数名には、先頭にドル記号 ($) を付ける必要があります。

詳細については、「 独自の変数を定義するを参照してください。

Condition セクションには、任意の数の LET ステートメントを使用でき、すべての規則の種類と速度セットの句を使用できます。

LET $fullName = @"user.firstName" + @"user.lastName"

見る

OBSERVE <ObservationFunction>(<KeyValuePairs>)
[ WHEN <BooleanExpression>

]

OBSERVE ステートメントは、ルールの実行を決定で終了しません。 キーと値のペアを API 応答またはトレース ログに記録するだけです。 後続の規則および規則句は、 RETURN ステートメントに達するまで引き続き実行されます。

OBSERVE ステートメントの後に、1 つ以上の監視関数が続く必要があります。

WHEN 句が存在し、False に評価される場合、OBSERVE ステートメントはログに記録されません。

次の規則では、各句に最大 1 つを使用できます。

  • 購入ルール
  • カスタム評価ルール
  • アカウント保護ルール

    OBSERVE Output(reason="high score")

    OBSERVE TRACE(ip=@"device.ipAddress") WHEN Model.Risk().スコア > 400

    RETURN <DecisionFunction>
    [ ,<ObservationFunction>(<KeyValuePairs>) ]
    [ WHEN <BooleanExpression> ]

    RETURN ステートメントは、ルールの実行を決定で終了します。

    ステートメントでは、有効な decision 関数 Approve()Reject()Challenge()、または Review()を指定する必要があります。

    ステートメントでは、1 つ以上の observation 関数: Output() または Trace() を指定することもできます。

    最後に、ステートメントに WHEN 句を含め、上記の条件を指定できます。

    次の規則では、句ごとに最大 1 つを使用できます。

    • 購入ルール
    • カスタム評価ルール
    • アカウント保護ルール

      RETURN Review()
      WHEN IsWatch("Device Support List", @"deviceAttributes.deviceId") ||
      IsWatch("Payment Support List", @"paymentInstrumentList.merchantPaymentInstrumentId")

      RETURN Reject(), Trace(ip=@"device.ipAddress") WHEN Model.Risk().スコア > 400

      ROUTETO QUEUE <QueueName>
      [ WHEN <BooleanExpression> ]

      ROUTETO コマンドは、照合評価をケース管理キューに転送するルーティング規則で使用

      省略可能な WHEN 句を使用して、コマンドがルーティングを実行する条件を記述できます。

      ルーティング規則では、句ごとに最大 1 つを使用できます。

      ROUTETO Queue("High Value Queue")
      WHEN @"purchase.request.totalAmount"> 500
      SELECT <AggregationFunction>
      AS <VelocityName>
      FROM <AssesmentType>
      GROUPBY <GroupExpression>
      [ WHEN <BooleanExpression> ]

      SELECT ステートメントは、速度セットで使用され、velocityを定義します。 aggregation 関数を指定する必要があります

      必要な AS 句を使用して、ベロシティのエイリアスを作成します。 その後、このエイリアスをルールから参照できます。

      必要な FROM 句を使用して、速度を監視する評価の種類を指定します。 有効な値は、 PurchaseAccountLoginAccountCreationChargebackBankEvent、および CustomAssessment です。

      必須の GROUPBY 句は、プロパティまたは式を指定します。 GROUPBY ステートメントで同じ値に評価されるすべてのイベントが結合され、SELECT ステートメントで要求された集計が計算されます。

      たとえば、各ユーザーの集計を計算するには、 GROUPBY @"user.userId"を使用します。

      省略可能な WHEN 句は、処理中の評価を定義されている速度に含めるかどうかを決定するブール式を指定します。

      ベロシティ セットでは、句ごとに最大 1 つを使用できます。

      SELECT Count() AS _Purchase_Rejections_Per_Email
      FROM 購入
      WHEN @"ruleEvaluation.decision" == "Reject"
      GROUPBY @"user.email"

      SELECT DistinctCount(@"purchaseId")
      AS _BankDeclines_Per_Device
      FROM BankEvent
      when @"status" == "DECLINED"
      GROUPBY @"purchase.deviceContext.externalDeviceId"

      WHEN <BooleanExpression>

      WHENステートメントは、他のステートメントのWHEN句に似ていますが、ルールと速度セットの Condition セクションに単独で表示されます。 ルール全体、速度セット、またはルーティング ルールを実行するかどうかを決定するブール条件を指定します。

      最大 1 つは、すべてのルールの種類と速度セットの [条件] セクションで使用できます。

      WHEN Model.Risk()。スコア > 400
      DO <Action 関数> DO ステートメントは、ルールの実行の最後に何らかのアクションを実行するために使用されます。 このステートメントは、事後決定アクションでのみ使用できます DO SetResponse(name = @"firstname" + @"lastname")

      属性と変数の参照

      at sign (@) 演算子を使用して、現在のイベントから属性を参照できます。

      変数 説明
      @

      アットマーク (@) は、受信イベントから属性を参照するために使用されます。 属性は要求ペイロードの一部として送信されるか、Microsoft Dynamics 365 Fraud Protection によって生成される可能性があります。

      アットマーク (@) の後に、参照する属性の完全なパスを指定します。 パスを引用符で囲みます (例: @"address.city")。

      参照される属性がイベント ペイロードの一部でない場合は、その型の既定値 (doubles の場合は 0.0、文字列の場合は空の文字列など) が返されます。

      属性の型は、属性が使用されているコンテキストから推論されます。 十分なコンテキストが指定されていない場合は、既定で String 型が使用されます。

      型推論の詳細については、「 属性の型推論を参照してください。

      @"address.city"

      $ ドル記号 ($) は、 LET ステートメントで定義されている変数を参照するために使用されます。 詳細については、「 独自の変数を定義するを参照してください。 $fullName
      @a[x]

      この変数は、配列変数のインデックスを作成するために使用されます。

      評価の要求ペイロードに項目の配列が含まれている場合は、次の構文を使用して、配列の個々の要素にアクセスできます: @"productList[0]"

      その要素の属性にアクセスするには、次の構文を使用します: @"productList[0].productId"

      @"productList[0].productId"

      @"paymentInstrumentList[3].type"

      Exists

      この演算子は、イベント ペイロードに変数が存在するかどうかを確認します。

      Exists(String 変数)

      Exists(@"user.email")
      Request.CorrelationId() この関数は、評価されるイベントの一意の関連付け ID を参照します。 この関数を使用すると、ルール エクスペリエンス内のイベントの関連付け ID にアクセスし、パラメーターまたはヘッダーとして外部呼び出しに渡すことができます。 External.MyExternalCall(Request.CorrelationId())
      .GetDiagnostics() この関数を使用すると、外部呼び出しまたは外部評価応答から重要な診断およびデバッグ情報を検出できます。 外部呼び出しの場合、Diagnostics オブジェクトには、要求ペイロード、エンドポイント、HttpStatus コード、エラー メッセージ、待機時間が含まれます。 エンドポイントは、外部評価応答の診断オブジェクトでは使用できません。 これらのフィールドは、対応する拡張メソッドを使用して診断オブジェクトを作成した後、ルールで使用できます。GetDiagnostics()"

      LET $extResponse = External。 myCall(@"device.ipAddress")

      LET $extResponseDiagnostics = $extResponse.GetDiagnostics()

      OBSERVE Output(Diagnostics = $extResponseDiagnostics)

      when $extResponseDiagnostics。 HttpStatusCode != 200

      独自の変数の定義

      LET キーワードを使用して変数を定義できます。 その変数は、ルール内の他の場所で参照できます。 すべての変数にドル記号 ($) を付けます。 たとえば、次の変数を宣言します。

      LET $fullName = @"user.firstName" + @"user.lastName"
      

      LET ステートメントで宣言されている変数は、ステートメントが定義されている規則または速度セットのスコープ内でのみ使用できます。

      たとえば、前の例の変数を参照するには、次のステートメントを記述します。

      WHEN $fullName == "Kayla Goderich"
      

      Note

      変数を定義した後は、新しい値で更新することはできません。

      グローバル変数関数

      グローバル変数関数を使用して、ルール内で変数を設定および取得できます。 グローバル変数を設定すると、同じ環境内または子環境内の意思決定規則、速度、ルーティング規則、および決定後アクション内でアクセスできます。 不正アクセス防止で使用される階層を次の表に示します。 たとえば、ルート環境内のルールでグローバル変数を設定した場合、Fraud Protection は、同じ環境内の同じ評価内の他のルールまたは任意の子環境でその値を取得できます。

      Operator Description
      SetVariables(k=v) この関数を使用して、キーと値のペアを設定できます。つまり、値を変数に設定します。 Do SetVariables(key= 123, email=@"user.email")
      GetVariable("k") この関数は、既に設定されている変数にアクセスするために使用できます。 設定されていない変数にアクセスする場合は、既定値が返されます。

      GetVariable("key")。AsInt()

      GetVariable("email")。AsString()

      GetVariable("key")。AsDouble()

      GetVariable("key")。AsBool()

      GetVariable("key")。AsDateTime()

      GetVariable("key")。AsJsonObject()

      GetVariable("key")。AsJsonArray()

      Note

      グローバル変数は、特定の評価の 1 つのトランザクションに固有です。 あるトランザクション内で設定された変数は、別のトランザクションまたは別の評価から取得できません。

      決定関数

      デシジョン関数は、決定を指定するルールで使用されます。

      決定の種類 説明
      Approve()

      この型は、 Approve の決定を指定します。 これには、承認の理由と、別のサポート メッセージを含めることができます。

      オーバー ロード:

      • Approve(String reason)
      • Approve(String reason, String supportMessage)

      RETURN Approve()

      RETURN Approve("on safe list")

      RETURN Approve ("on safe list", "do not escalate")

      Reject()

      この型は、 Reject の決定を指定します。 拒否の理由と、別のサポート メッセージを含めることができます。

      オーバー ロード:

      • Reject(String reason)
      • Reject(String reason, String supportMessage)

      RETURN Reject()

      RETURN Reject("embargo country")

      RETURN Reject("embargo country", "do not escalate")

      Review()

      この型は、 Review の決定を指定します。 レビューの理由と、別のサポート メッセージを含めることができます。

      オーバー ロード:

      • Review(String reason)
      • Review(String reason, String supportMessage)

      RETURN Review()

      RETURN Review("user on watch list")

      RETURN Review("user on watch list", "do not escalate")

      Challenge(String challengeType)

      この型は、 Challenge チャレンジ型の決定を指定します。 また、チャレンジの理由や別のサポート メッセージを含めることもできます。

      オーバー ロード:

      • Challenge(String challengeType, String reason)
      • Challenge(String challengeType, String reason, String supportMessage)

      RETURN Challenge ("SMS")

      RETURN チャレンジ ("SMS"、"suspected bot")

      RETURN チャレンジ ("SMS"、疑わしいボット"、"エスカレートしない")

      観測関数

      監視関数を使用して、現在のコンテキストからデータを取得し、別の場所に書き込むことができます。

      返り値の種類 説明
      Output(k=v) この関数を使用して、API 応答の CustomProperties セクションにキーと値のペアを渡すことができます。 キーと値のペアは、Output() ステートメントを含む句の名前と同じ名前のオブジェクト内に入れ子になります。 Output(key="test", email=@"user.email", countryRegion=geo.CountryRegion(@"device.ipAddress"))
      Trace(k=v) この関数を使用すると、Trace イベントをトリガーし、キーと値のペアを FraudProtection.Trace.Rule Event Tracing 名前空間に送信 Trace(key="Manual Review", ip=@"device.ipAddress")
      SetResponse(String sectionName, k=v) この関数を使用して、API 応答の CustomProperties セクションにキーと値のペアを渡すことができます。 sectionName は省略可能なパラメーターで、スキップできます。 この関数は、事後決定アクション内でのみ使用できます。決定ルール内では使用できません

      SetResponse("Scores", bot = Model.Bot(@deviceContextId), risk=Model.Risk())

      SetResponse(test="123")

      Response.Decision() この関数は、評価中の現在の評価の決定を参照します。 Response.Decision() == "Approve"

      集計関数

      関数 説明
      Count() この関数は、イベントが発生した回数を返します。 SELECT Count() AS numPurchases
      DistinctCount(String key) この関数は、指定したプロパティの個別の値の数を返します。 指定したプロパティが受信イベントに対して null または空の場合、イベントは集計に影響しません。 SELECT DistinctCount(@"device.ipAddress") AS distinctIPs
      Sum(Double value) この関数は、指定された数値プロパティの値の合計を返します。 SELECT Sum(@"totalAmount") AS totalSpending

      論理演算子

      Operator Description
      および (>) Logical And

      Model.Risk()。スコア > 500 & Model.Risk() です。スコア < 800

      Model.Risk()。スコア > 500 と Model.Risk() です。スコア < 800

      または (||) Logical Or

      @"email.isEmailUsername" == false || @"email.isEmailValidated" == false

      @"email.isEmailUsername" == false または @"email.isEmailValidated" == false

      not 論理否定 @"email.isEmailUsername" not(!) @"email.isEmailUsername"

      比較演算子

      Fraud Protection では、すべての標準的な C# comparison および equality 操作がサポートされます。 この表には、便利な演算子の例がいくつか含まれています。 これらの演算子を文字列に適用すると、辞書式比較が行われます。

      Operator Description
      == この演算子は、等しいかどうかを確認します。 @"user.countryRegion" == @"shippingAddress.countryRegion"
      != この演算子は、不等値をチェックします。 @"user.countryRegion" != @"shippingAddress.countryRegion"
      > この演算子は、最初の値が 2 番目の値より大きいかどうかを確認します。 Model.Risk()。スコア > 500
      < この演算子は、最初の値が 2 番目の値より小さいかどうかを確認します。 Model.Risk()。スコア < 500
      >= この演算子は、最初の値が 2 番目の値以上かどうかを確認します。 Model.Risk()。スコア >= 500
      <= この演算子は、最初の値が 2 番目の値以下かどうかを確認します。 Model.Risk()。スコア <= 500
      X ? Y : Z この演算子は、条件 X が true かどうかを確認します。 true の場合、ステートメント Y が実行され、その結果が返されます。 それ以外の場合は、ステートメント Z が実行され、その結果が返されます。 かっこを使用して複数の論理チェックを組み合わせて、入れ子になった IF <> THEN <> ELSE <> ロジックを定義することもできます。 LET $riskbucket = Model.Risk()。スコア > 500 ? "High" : (Model.Risk()。スコア > 300 ? "Medium" : "Low")

      数学関数

      Fraud Protection では、標準のすべての C# math メソッド および arithmetic 演算子がサポートされています。 この表には、役に立つメソッドの例がいくつか含まれています。

      Operator Description
      Math.Min(Double value1, Double value2) この演算子は、2 つの値の最小値を計算します。 Math.Min(Model.Risk().Score、Model.Bot(@"deviceFingerprinting.id")。スコア)
      Math.Max(Double value1, Double value2) この演算子は、最大 2 つの値を計算します。 Math.Max(Model.Risk().Score、Model.Bot(@"deviceFingerprinting.id")。スコア)
      RandomInt(Integer min, Integer max) この演算子は、最小値と最大値を除く、指定された範囲内のランダムな整数を返します。 RandomInt(0, 100)

      DateTime 演算子

      Fraud Protection では、標準の C# DateTime プロパティ、メソッド、演算子がサポートされています。 この表には、便利な関数とプロパティの例がいくつか含まれています。

      Operator Description
      UtcNow この演算子は、コンピューター上の現在の日付と時刻 (UTC) に設定された DateTime オブジェクトを取得します。 DateTime.UtcNow
      今日 この演算子は、時刻コンポーネントが 00:00:00 に設定されている現在の日付に設定されているオブジェクトを取得します。 DateTime.Today
      Subtract この演算子は、入力 DateTime から指定した日付と時刻を減算することによって、新しい DateTime を返します。 DateTime.UtcNow.Subtract(@var1.ToDateTime())
      DaysSince(DateTime date) この演算子は、指定した DateTime 値と現在の日付 (協定世界時 (UTC) で表される) の間で渡された日数を表す整数を返します。 DaysSince(@"user.CreationDate")
      Year この演算子は、このインスタンスによって表される日付の年のコンポーネントを取得します。 @"user.creationDate".年
      この演算子は、このインスタンスと同じ日付を持ち、時刻の値が 00:00:00 (午前 0 時) に設定されている新しいオブジェクトを取得します。 @"user.creationDate".日付

      型キャスト演算子

      型推論の詳細については、この記事で後述する「属性の 型推論 」セクションを参照してください。

      Operator Description
      Convert.ToDateTime

      この演算子は、文字列を datetime に変換し、指定された形式を使用して datetime を文字列に変換します。

      Convert.ToDateTime(@"user.creationDate")。ToString("yyyy-MM-dd")
      Convert.ToInt32

      この演算子は、指定した値を Int32 に変換します。

      Convert.ToInt32(@var)
      Convert.ToDouble

      この演算子は、指定した値を Double に変換します。

      Convert.ToDouble(@var)

      文字列関数

      Fraud Protection では、標準の C# string クラスがサポートされています。 この表には、便利な関数と演算子の例がいくつか含まれています。

      Operator Description
      StartsWith() この演算子は、文字列が指定したプレフィックスで始まるかどうかを確認します。 @"user.phoneNumber".StartsWith("1-")
      EndsWith() この演算子は、文字列が指定したサフィックスで終わるかどうかを確認します。 @"user.email".EndsWith("@contoso.com")
      IsNumeric() この演算子は、文字列が数値であるかどうかを確認します。 @"user.email".IsNumeric()
      長さ

      この演算子は、文字列内の文字数を返します。

      @"user.username".Length
      ToDateTime() この演算子は、文字列を DateTime オブジェクトに変換します。 @"user.creationDate".ToDateTime()
      ToDouble() この演算子は、文字列を Double 値に変換します。 @"productList.purchasePrice".ToDouble()
      ToInt32() この演算子は、文字列を Int32 値に変換します。 @"zipcode".ToInt32()
      ToUpper() この演算子は、この文字列のコピーを大文字に変換して返します。 @"user.username".ToUpper()
      ToLower() この演算子は、小文字に変換されたこの文字列のコピーを返します。 @"user.username".ToLower()
      IndexOf() この演算子は、指定した文字列内で指定された部分文字列が最初に出現した位置の 0 から始まるインデックスを報告します。 @"user.username".IndexOf("@")
      LastIndexOf() この演算子は、指定した文字列内で特定の部分文字列が最後に出現した位置の 0 から始まるインデックスを報告します。 @"user.username".LastIndexOf("@")
      Substring() この演算子は、文字列内の 0 から始まるインデックスから始まる部分文字列を返します。2 番目の省略可能なパラメーターは、目的の部分文字列の長さを指定します @"user.username".Substring(0,5)
      IsNullOrEmpty() この演算子は、指定した文字列が null または空の場合に返します。 それ以外の場合は、false を返します。 @"user.username".IsNullOrEmpty()
      IgnoreCaseEquals() 大文字と小文字の違いに関係なく、2 つの文字列が等しい場合、この演算子は true を返します。 それ以外の場合は、false を返します。 @"user.username".IgnoreCaseEquals(@"user.email")
      Contains() この演算子は、文字列に別の文字列が含まれているかどうかを確認します。 @"productList.productName".Contains("Xbox")
      ContainsOnly() この演算子は、指定された文字セットのみが文字列に含まれているかどうかを確認します。 @"zipcode"。ContainsOnly(CharSet.Numeric)
      ContainsAll() この演算子は、指定されたすべての文字セットが文字列に含まれているかどうかを確認します。 @"zipcode"。ContainsAll(CharSet.Numeric|CharSet.ハイフン)
      ContainsAny() この演算子は、指定された文字セットが文字列に含まれているかどうかを確認します。 @"zipcode"。ContainsAny(CharSet.Numeric|CharSet.ハイフン)

      ContainsOnly、ContainsAll、ContainsAny で CharSet を使用する

      ContainsOnly、ContainsAll、ContainsAny では、次の文字型を使用できます。

      Character Type 説明
      アルファベット順 a~z、A~Z
      アポストロフィ '
      Asperand @
      円記号 \
      コンマ ,
      Hyphen -
      数値 0-9
      Period .
      スラッシュ /
      アンダースコア _
      空白 1 つのスペース

      ジベリッシュ検出機能

      これらの関数は、主要なユーザー入力フィールド (名前や住所など) にギバーシが含まれているかどうかを迅速かつ効率的に検出することで、不正行為を防ぐのに役立ちます。

      関数 説明
      GetPattern(String).maxConsonants 母音で区切られていない文字列内の連続する子音の最大数。 たとえば、文字列 "01gggyturah" の maxConsonants は 5 です。 GetPattern(@"user.email").maxConsonants
      GetPattern(String).gibberScore 0 から 1 の ML ベースのスコア。0 はちんぷんかんぷんになる可能性が最も高く、1 はちんぷんちんになる可能性が最も低いということです。 GetPattern(@"user.email").gibberScore

      Note

      Gibberish 検出モデルは、一般に公開されている英語ドキュメントの 2 つの連続する英数字の頻度に基づいています。 2 つの連続する英数字がパブリック ドキュメントに出現する頻度が高いほど、ギバーシシである可能性が低いと想定されます。 このモデルでは、英語のテキストに適切なスコアを提供する必要があり、名前またはアドレスにギバーシが含まれているかどうかを検出するために使用できます。 ただし、モデルは、州の短い形式 (AZ、TX など) などの省略形には適していない場合があり、名前やアドレスの検証にも使用できません。 最後に、モデルは英語以外のテキストについてテストされていません。

      パターン検出関数

      これらの関数は、主要なユーザー入力フィールド (名前や住所など) にギバーシが含まれているかどうかを迅速かつ効率的に検出することで、不正行為を防ぐのに役立ちます。

      関数 説明
      Patterns.IsRegexMatch(string pattern, string source) 文字列ソースに対して文字列パターンの正規表現 (正規表現) の一致を実行します。 結果はブール値です。つまり、true (指定された文字列がパターンと一致したことを示します) または false (一致がないことを示します) のいずれかです。 Patterns.IsRegexMatch("^.com$", @ "user.email") Patterns.IsRegexMatch( "^.[aAeEiIoOuU]+.*$", @ "user.firstname")

      Note

      • 文字列パターンは定数入力である必要があります。
      • 評価時間が 10 ミリ秒を超えると、関数は false (既定の結果) を返します。
      • NonBacktracking をサポートしていないすべてのは IsRegexMatch 関数にも適用されます。

      モデル関数

      モデル関数はさまざまな不正行為モデルを実行し、評価で 1 つ以上の不正行為モデルが自動的に実行されない場合に役立ちます。 モデル関数を実行すると、ルールの評価中に実行されているモデルに関する情報が不正評価 API 呼び出しに出力されます。 次に、ルールは、スコア、理由などを含むモデルの結果にアクセスし、さらにルールの処理と意思決定に使用できます。

      モデルの種類 説明
      リスク セッションが危険である可能性を評価します。 Model.Risk()
      ボット セッションがボットによって開始される可能性を評価します。 Fraud Protection のデバイス フィンガープリント ソリューションに送信されたデバイス コンテキスト ID を渡します。 Model.Bot(@deviceContextId)

      geo 関数

      geo 関数は、IP アドレスを地理的アドレスに変換することで解決を提供します。 geo 関数は、トランザクション ペイロードの一部である IP を使用するか、デバイスフィンガープリントを使用して不正防止によって収集された IP を使用してのみルールで呼び出すことができます。 任意の IP 値に対して geo 関数を呼び出すことはできません。

      Operator Description
      Geo.RegionCode(String ip)

      このオペレーターは、IPv4 アドレスを米国のリージョン コード (つまり、米国の州または地域の名前の省略形) に変換します。

      たとえば、ワシントン州の IP アドレスの場合、"WA" が返されます。

      Geo.RegionCode(@"device.ipAddress")
      Geo.Region(String ip)

      このオペレーターは、IPv4 アドレスを米国リージョン (つまり、米国の州または地域の名前) に変換します。

      たとえば、ワシントン州の IP アドレスの場合、"Washington" が返されます。

      Geo.Region(@"device.ipAddress")
      Geo.CountryCode(String ip)

      この演算子は、IPv4 アドレスを国/地域コードに変換します。

      たとえば、オーストラリアの IP アドレスの場合、"AU" が返されます。

      Geo.CountryCode(@"device.ipAddress")
      Geo.CountryRegion(String ip)

      この演算子は、IP アドレスをリージョン名に変換します。

      たとえば、オーストラリアの IP アドレスの場合、"Australia" が返されます。

      Geo.CountryRegion(@"device.ipAddress")
      Geo.City(String ip)

      この演算子は、IPv4 アドレスを市区町村名に変換します。

      たとえば、ニューヨーク市の IP アドレスの場合、"New York City" が返されます。

      Geo.City(@"device.ipAddress")
      Geo.MarketCode(String ip)

      このオペレーターは、IPv4 アドレスを IP アドレスの市場コードに変換します。

      たとえば、カナダからの IP アドレスの場合、"NA" (北米) が返されます。

      Geo.MarketCode(@"device.ipAddress")

      デバイス属性関数

      Operator Description
      Device.GetFullAttributes(String sessionId) 指定したデバイス フィンガープリント セッションのデバイス属性の完全なセットを返します。 デバイス属性の完全なセットを表示するには、「 デバイスフィンガープリントの設定 を参照してください。 Device.GetFullAttributes(@"deviceFingerprinting.id")
      Device.GetAttributes(String sessionId) 指定したデバイスフィンガープリント セッションのデバイス属性の小さなサブセットを返します。 サブセットは、Fraud Protection によってキュレーションされたリストであり、最も一般的に使用される属性が含まれています。 Device.GetAttributes(@"deviceFingerprinting.id")
      Device.GetSelectedAttributes(String sessionId, String attributeName) 指定されたデバイス フィンガープリント セッションの最大 20 個のデバイス属性を返します。 必要な属性のリストは、コンマ区切りパラメーターとして指定する必要があります Device.GetSelectedAttributes(@"deviceFingerprinting.id", "deviceAsn","deviceCountryCode")
      Device.GetSpeedOfTravel(String sessionId) デバイスの最大移動速度を 1 時間あたりのマイル単位で返します。 Fraud Protection は、最後の 5 つの連続するフィンガープリント セッションを取得し、デバイスの速度をセッションからセッションまで計算して最大速度を返すことで、最大速度を決定します。 デバイスは、Cookie ID を使用してセッションで識別されます。 Device.GetSpeedOfTravel(@"deviceFingerprinting.id")

      BIN 参照関数

      BIN 参照機能では、銀行識別番号 (BIN) に基づいて、支払カード アカウント情報 (カード ネットワーク、カードの種類、カードの国コード、カード カテゴリなど) が提供されます。 BIN 参照のデータは、第三者の主要な BIN データ プロバイダーから取得され、不正アクセス防止によってキュレーションされます。

      Operator Description
      ごみ箱。Lookup(String BIN).cardNetwork

      この関数は BIN を検索し、カード ネットワーク (Visa、Mastercard など) を返します。

      ごみ箱。Lookup(@"card.bin").cardNetwork
      ごみ箱。Lookup(String BIN).cardType

      このオペレーターは BIN を検索し、カードの種類 (デビット、クレジットなど) を返します。

      ごみ箱。Lookup(@"card.bin").cardType
      ごみ箱。Lookup(String BIN).issuer

      このオペレーターは BIN を検索し、発行組織を返します。

      ごみ箱。Lookup(@"card.bin").issuer
      ごみ箱。Lookup(String BIN).countryCode

      この演算子は BIN を検索し、カードの ISO 2 文字の国コードを返します。

      ごみ箱。Lookup(@"card.bin").countryCode
      ごみ箱。Lookup(String BIN).cardCategory

      このオペレーターは BIN を検索し、カード カテゴリ (プリペイド、企業、リワードなど) を返します。

      ごみ箱。Lookup(@"card.bin").cardCategory
      ごみ箱。Lookup(String BIN).error

      この演算子は BIN を検索し、BIN が見つからなかった場合にエラー メッセージを返します。

      ごみ箱。Lookup(@"card.bin").error

      リスト機能

      不正アクセス防止を使用すると、カスタム リストをアップロードし、言語で参照できます。 これらのリストをアップロードする方法については、「 管理リストを参照してください。 ルールでリストを使用する方法の詳細については、この記事で後述する「 ルールでのリストの使用 」セクションを参照してください。

      Operator Description
      ContainsKey(
      String listName,
      String columnName,
      String key)
      この演算子は、不正アクセス防止 リストの指定された列にキーが含まれているかどうかを確認

      次の列の例では、"Email Support List" リストの "Emails" 列に @"user.email" 変数が含まれているかどうかを確認します。

      ContainsKey("Email Support List", "Emails", @"user.email")
      Lookup(
      String listName,
      String keyColName,
      String valueColName)
      このオペレーターは、不正アクセス防止リスト内のキーの値を検索します。 キーを含む列の名前と、値を含む列の名前の両方を指定する必要があります。

      値は常に文字列として返されます。 キーが見つからない場合、および defaultValue パラメーターが指定されていない場合は、"Unknown" が返されます。

      次の列の例では、Email サポート リストの Emails 列で @"user.email" 変数値を探します。 一致が見つかった場合、この関数はリスト内の一致する行から Status 列の値を返します。 一致するものが見つからない場合、関数は 0 を返します。

      Lookup("Email Support List", "Emails", @"user.email", "Status",0)
      In この演算子は、キーが値のコンマ区切りのリストに含まれているかどうかを確認します。 In(@"user.countryRegion", "US, MX, CA")
      InSupportList この演算子は、属性がサポート リストにあるかどうかを確認します。 InSupportList('Email Support List', @"user.email")
      IsSafe この演算子は、エンティティがサポート リストで安全としてマークされているかどうかを確認します。 IsSafe('Email Support List', @"user.email")
      IsBlock この演算子は、エンティティがサポート リストでブロックとしてマークされているかどうかを確認します。 IsBlock('Email Support List', @"user.email")
      IsWatch この演算子は、エンティティがサポート リストで Watch としてマークされているかどうかを確認します。 IsWatch('Email Support List', @"user.email")

      ルールでのリストの使用

      ContainsKey および Lookup 演算子を使用して、Fraud Protection にアップロードしたリストを参照できます。 リストの詳細については、「 管理リストを参照してください。

      ContainsKey

      リストの 1 つに特定の値が含まれているかどうかを確認するには、 ContainsKey 演算子を使用します。 リスト名、列、およびチェック対象のキーを指定します。

      たとえば、危険な電子メール アドレスの単一列リストをアップロードし、その名前 Risky 電子メール リストします。

      メール
      Kayla@contoso.com
      Jamie@bellowscollege.com
      Marie@atatum.com

      その後、次の構文を使用して、この一覧の危険なメール アドレスからすべてのトランザクションを拒否できます。

      RETURN Reject("risky email") 
      WHEN ContainsKey("Risky email list", "Email", @"user.email")
      

      この句は、"危険な電子メール リスト" リストの "Email" 列に @email キーが含まれているかどうかを確認します。 その場合、トランザクションは拒否されます。

      参照

      複数列リストの場合は、 Lookup 演算子を使用して、特定のキーの列の値を確認できます。

      たとえば、メール アドレス用の 1 つの列と、それらのメール アドレスの状態を示す別の列を含むリストを作成します。 このリスト Email Listという名前を付けます。

      メール 状態
      Kayla@contoso.com 危険を伴う
      Jamie@bellowscollege.com 危険を伴う
      Marie@atatum.com 危険を伴う
      Camille@fabrikam.com Safe
      Miguel@proseware.com Safe
      Tyler@contoso.com Safe

      その後、次の構文を使用して、状態が Risky の電子メール アドレスからのすべてのトランザクションを拒否できます。

      RETURN Reject("risky email") 
      WHEN Lookup("Email List", "Email", @"user.email", "Status") == "Risky"
      

      この句は、[電子メール リスト] リストの [電子メール] 列で @"user.email" キーを探し、[状態] 列の値が Risky かどうかを確認します。 その場合、トランザクションは拒否されます。

      @"user.email" キーが一覧に見つからない場合、Fraud Protection は "Unknown" を返します。

      5 番目のパラメーターとして独自の既定値を指定することもできます。 詳細については、この記事で前述した「 Logical 演算子 」セクションを参照してください。

      Lookup 演算子は常に String 値を返します。 この値を IntDouble、または DateTime 値に変換するには、 型キャスト演算子を使用します。

      外部呼び出し、外部評価、速度の使用

      • 外部呼び出しを参照するには、「 External」と入力し、その後に参照する外部呼び出しを入力します。 詳細については、「 ルールで外部呼び出しを使用するを参照してください。
      • 外部評価を参照するには、「 Assessments」と入力し、参照する外部評価を入力します。 詳細については、「 ルールで外部評価を使用するを参照してください。
      • ベロシティを参照するには、「 Velocity」と入力し、その後に参照する速度を入力します。 詳細については、「 ルールでベロシティを使用する」を参照してください。

      属性の型推論

      変数型は、使用されているコンテキストから推論されます。 次に例をいくつか示します。

      • WHEN @isEmailValidatedでは、変数は Boolean 値として解釈されます。
      • Model.Risk() です。スコア > 500、変数は Double 値として解釈されます。
      • @"user.creationDate"。年 < DateTime.UtcNow.Year、変数は DateTime 値として解釈されます。

      変数の型を推論するのに十分なコンテキストがない場合は、 String 値と見なされます。 たとえば、式 Model.Risk() です。Model.Bot(@"deviceFingerprinting.id") < スコア付けします。スコア、両方の変数が文字列として解釈されます。

      文字列以外の変数の型を指定するには、 型キャスト演算子を使用します。

      JSON 配列とオブジェクト

      FQL では、ローカル変数としての複雑な構造化オブジェクトの構築がサポートされています。これは、JSON 形式で外部呼び出しまたは外部評価に渡すことができます。 FQL の他のすべてのローカルと同様に、配列とオブジェクトは一度作成すると変更できません。

      JSON 配列

      配列は、式を角かっこで囲むことで作成されます。

      LET $arr1 = [ "hello", "world" ]
      LET $arr2 = [
        "this is also an array",
        78.4,
        $arr1,
        @"user.email",
        External.MyExtcall()
      ]
      

      JSON オブジェクト

      オブジェクトは中かっこで作成されます。

      LET $obj1 = { isObject: true }
      LET $obj2 = {
        numberField: 7,
        fieldIs: "string",
        internalObj: $obj1,
        inline: {
          innerInnerField: "hello"
        }
      }
      

      JSON 配列とオブジェクトの FQL 関数

      構文 説明
      myArr[0] この構文を使用すると、インデックスによって特定の配列要素にアクセスできます。 myArr [0].property
      myArr [0][0]
      myArr [0][0].property
      myArr [0].property[0]
      myArr [0].property[0].property

      上の例 myArrは配列です。 この配列のソースには、@@payloadProperty、外部評価応答、外部呼び出し応答、ローカル変数、またはグローバル変数を指定できます。

      さまざまな配列ソースに基づいて構文を使用する方法の例を次に示します。

      • 配列ソース: ペイロード
      LET $sample = @@"myArr[0]".AsJsonArray()   
      RETURN Approve()   
      WHEN $sample[0].AsString() == "a"
      
      • 配列ソース: ローカル変数
        LET $group1 =["a", "b", "c"]
        LET $group1 =[{ item1: "a", item2: "b"}, { item1: "c", item2: "d"}]
        LET $group3 =[{ item1: "a", item2: "b", item3: ["c", "d"]}, {{ item1: "e", item2: "f", item3: ["g", "h"]}]
        RETURN Approve()
        WHEN $group1[0].AsString() == "a" && $group1[0].item2.AsString() == "b" && $group3[0].item3[0].AsString() == "c" 
        
      構文 説明
      Array.GetValue (TargetArray 。AsJsonArray()、matchKey、matchValue、lookupKey) この関数を使用すると、条件に一致する最初の配列要素にアクセスできます。

      値を返します。

      Array.GetValue(@@"payloadProperty"。AsJsonArray()、matchKey、matchValue、lookupKey)
      Array.GetValues(TargetArray 。AsJsonArray()、matchKey、matchValue) この関数を使用すると、条件に一致する配列要素のセットにアクセスできます。

      配列を返します。

      Array.GetValues(@@"payloadProperty"。AsJsonArray()、matchKey、matchValue)

      さまざまな配列ソースに基づいて上記の構文を使用する方法のより詳細な例を次に示します。

      配列ソース Array.GetValue Array.GetValues
      外部評価 LET $a = Assessments.myAssessment.evaluate()
      LET $sample = Array.GetValue($a.ruleEvaluations.AsJsonArray(), "rule", "Sample Payload Generation", "clauseNames"))
      RETURN Approve()
      WHEN $sample[0].AsString() == "TestData"
      LET $a = Assessments.myAssessment.evaluate()
      LET $sample = Array.GetValues($a.ruleEvaluations.AsJsonArray(), "rule", "Sample Payload Generation"))
      RETURN Approve()
      WHEN $sample[0].clauseNames[0].AsString() == "TestData"
      Payload ペイロード サンプル: {"group":[{"item1": "a", "item2": "a1"}, {"item1": "b", "item2": "b1"}]}

      LET $sample = Array.GetValue(@@"group"AsJsonArray()、"item1"、"a"、"item2")
      RETURN Approve()WHEN $sample。AsString() == "a1"
      ペイロードサンプル: { "group":[{"item1": "a", "item2": "a1"}, {"item1": "b", "item2": "b1"}]}

      LET $sample = Array.GetValues(@@"group".AsJsonArray()、"item1"、"a")
      RETURN Approve()

      WHEN $sample[0].item2.AsString() == "a1"

      グローバル変数 上記と同じペイロード サンプルを使用する

      Do SetVariables(Var=@@"group")
      LET $group = GetVariable("Var") です。AsJsonObject()
      LET $value = Array.GetValue($group, "item1", "a", "item2")
      RETURN Approve()
      WHEN $value。AsString() == "a1"
      上記と同じペイロード サンプルを使用する

      Do SetVariables(Var=@@"group")
      LET $group = GetVariable("Var") です。AsJsonObject()
      LET $arr = Array.GetValues($group.AsJsonArray()、"item1"、"a")
      RETURN Approve()
      外部呼び出し

      外部呼び出し (myCall) 応答: {"group":[{"item1": "a", "item2": "a1"}, {"item1": "b", "item2": "b1"}]}

      LET $x = External.myCall()。AsJsonObject()
      LET $value = Array.GetValue($x.group[0].AsJsonObject()、"item1"、"a"、"item2")
      RETURN Approve()
      WHEN $value。AsString() == "a1"

      外部呼び出し (myCall) 応答: {"group":[{"item1": "a", "item2": "a1"}, {"item1": "b", "item2": "b1"}]}

      LET $x = External.myCall()。AsJsonObject()
      LET $arr = Array.GetValues($x.group[0].AsJsonObject()、"item1"、"a")
      RETURN Approve()WHEN $arr[0].item2。AsString() == "a1"

      JSON 配列とオブジェクトの型キャスト

      • 次の 。As<Type>() は JsonObject からサポートされています。

        • AsString()
        • AsInt()
        • AsDouble()
        • AsDateTime()
        • AsBool()
        • AsJsonArray()
        • AsJsonObject()
      • Array.GetValue または Arrays.GetValues という 2 つの配列ヘルパー メソッドのいずれかを使用する場合は、 を使用してキャストを入力する必要があります。As<Type>(). 例:

        LET $arr = {myArr:[{item1: "red", number: 45}, {item1: "blue", number: 56}, {item1: "green", number: 33}]}
        LET $sample = Array.GetValues($arr.myArr.AsJsonArray(), "item1", "blue")
        
      • データを JSON オブジェクトまたは配列に明示的に変換したら、 を使用できます。As<Type>() を使用して、必要に応じて別のデータ型にキャストします。 例:

        RETURN Approve()
        WHEN $sample[0].number.AsInt() == 56
        
      • @@を使用すると、データは暗黙的に JSON オブジェクトに型キャストされます。 その後、JSON オブジェクトを別のデータ型に変換する場合は、 を使用する必要があります。As<Type>(). 例:

        LET $sample = @@”user.addresses”.AsJsonArray()
        
      • 特定の形式で出力する場合は、 を使用する必要があります。As<Type>(). 例:

        LET $sample = @@”user.addresses”
        Output(abc = $sample.AsJsonArray())
        

      Note

      型キャストのベスト プラクティス:

      • 常に、 . チェーンの末尾にキャストを入力します。
      • わからない場合は、常に明示的に型キャストを使用します。As<Type>(). 例:
      LET $sample = External.myCall().data[0].Item1[0].AsJsonArray()
      
      Or
      
      LET $sample = @@”accommodations[0].rooms”.AsJsonArray()
      

      Post Decision Actions 内で使用できる関数

      次の関数は、Post Decision Actions 内でのみ使用できます。 これらは、意思決定ルール内では使用できません

      構文 説明
      SetResponse(String sectionName, k=v) この関数を使用して、API 応答の CustomProperties セクションにキーと値のペアを渡すことができます。 sectionName は省略可能なパラメーターで、スキップできます。 SetResponse("Scores", bot = Model.Bot(@deviceContextId), risk=Model.Risk())

      SetResponse(test="123")

      Response.Decision() この関数は、評価中の現在の評価の決定を参照します。 Response.Decision() == "Approve"