← l-artikli kollha

.NET

Nibni Regola Sempliċi ta' Fraud Detection f'.NET

Spjegazzjoni ta' regola waħda reali kontra l-frodi: l-interface, it-tip ta' verdett, il-query tar-repository warajha, u għaliex kollox huwa madwar 20 linja ta' loġika vera.

Nibni Regola Sempliċi ta' Fraud Detection f'.NET

Fraud detection tinstema' bħallikieku għandha tkun ikkumplikata. L-ewwel regola reali li ktibt hija madwar għoxrin linja, u l-biċċa l-kbira tax-xogħol marret fil-forma ta' madwarha aktar milli fil-loġika nfisha. Hawn hi kollha, biċċa biċċa.

Ibda bil-kuntratt

Kull regola timplimenta interface waħda. Dak li jagħmel ir-regoli jiżdiedu mingħajr ma jmisshom il-kodiċi li jħaddimhom:

public interface IFraudRule
{
    string RuleName { get; }
    Task<FraudVerdict> EvaluateAsync(Payment payment, CancellationToken ct = default);
}

Żewġ deċiżjonijiet ta' min isemmihom. RuleName teżisti għax meta pagament jiġi rrifjutat, trid tkun taf liema regola għamlitha, u dik l-istring tispiċċa maħżuna mal-flag. U EvaluateAsync tirritorna verdett minflok bool, għax "suspicious" waħdu ma jiswa xejn meta xi ħadd jistaqsi għaliex iktar tard.

It-tip ta' verdett

public record FraudVerdict(bool IsSuspicious, string? Details)
{
    public static FraudVerdict Clean { get; } = new(false, null);
    public static FraudVerdict Suspicious(string details) => new(true, details);
}

Clean hija istanza waħda cached peress li ma ġġorr l-ebda informazzjoni, filwaqt li Suspicious teħtieġ li tgħaddi d-dettalji. Ma tistax tibni verdett suspicious mingħajr ma tispjegah, u dak hu l-punt.

Ir-regola nnifisha

Il-mudell li ridt naqbad huwa card testing: xi ħadd b'lista ta' numri ta' kards misruqa li jħaddem tranżazzjonijiet żgħar biex isib liema kards għadhom ħajjin qabel ma verament jonfoq minnhom. Dan jidher bħal declines ripetuti fuq l-istess card f'window qasira.

public class DeclineVelocityRule(IPaymentReadOnlyRepository readRepo) : IFraudRule
{
    private const int MaxRecentDeclines = 3;
    private static readonly TimeSpan Window = TimeSpan.FromHours(24);

    public string RuleName => "DeclineVelocity";

    public async Task<FraudVerdict> EvaluateAsync(Payment payment, CancellationToken ct = default)
    {
        var declines = await readRepo.CountRecentDeclinedAttempts(
            payment.CardBin, payment.CardLast4, Window);

        return declines >= MaxRecentDeclines
            ? FraudVerdict.Suspicious($"Card reached {declines} declined attempts within {Window.TotalHours}h.")
            : FraudVerdict.Clean;
    }
}

Dik hija r-regola kollha. Għodd id-declines riċenti għal din il-card, qabbel ma' limitu, irritorna verdett b'spjegazzjoni.

Il-partijiet li mhumiex il-loġika

Tliet affarijiet hemmhekk jimpurtaw aktar mit-tqabbil innifsu.

Ir-regola tidentifika card permezz tal-BIN u l-aħħar erba' ċifri, mhux permezz tan-numru sħiħ tal-card, għax in-numru sħiħ qatt ma jinħażen imkien. Dan huwa biżżejjed biex tirrikonoxxi l-istess card fost tranżazzjonijiet mingħajr ma żżomm dejta li m'għandix.

Tiddependi fuq interface ta' repository read-only minflok DbContext. Ir-regola ma tafx u ma jimpurtahiex jekk l-għadd jiġix minn SQLite, SQL Server, jew cache, u dak hu li jagħmilha testabbli mingħajr database.

Il-limitu u l-window huma constants fil-quċċata minflok numri moħbija fit-tqabbil. Tliet declines fi 24 siegħa hija deċiżjoni ta' ġudizzju, mhux fatt, u huwa t-tip ta' numru li jiġi rranġat ladarba tara traffiku reali, għalhekk għandu jkun ovvju fejn tibdlu.

Fejn taħdem

Ir-regola tiġi evalwata qabel ma jiġi kkuntattjat kwalunkwe payment gateway. Card li diġà tidher qed tiġi ttestjata ma tiswa xejn biex tiġi rrifjutata, u m'hemm ebda raġuni li tonfoq sejħa gateway biex issib dak li diġà taf mill-istorja.

X'nibdel b'dejta reali

Il-limitu huwa stima. Tliet declines fi 24 siegħa jidhru raġonevoli, iżda sistema reali tirranġa dan skont it-traffiku attwali, u probabbilment tvarjah skont l-ammont jew kemm il-klijent huwa stabbilit. Klijent ġdid li jfalli tliet darbiet huwa sinjal differenti ħafna minn klijent regolari li jfalli tliet darbiet għax il-card tiegħu għadha kif skadiet.

Dik hija l-parti li proġett ta' studju verament ma jistax jgħallimni. Dak li jista' jgħallem huwa l-forma: kuntratt, verdett li jispjega ruħu, u limiti li joqogħdu f'post ovvju biżżejjed biex jinbidlu meta titgħallem li huma żbaljati.