StyloBot Release Series: Behavior-Aware ASPM SK2NET UI (Italiano (Italian))

StyloBot Release Series: Behavior-Aware ASPM SK2NET UI

Monday, 01 June 2026

//

25 minute read

La detezione del bot non dovrebbe fermarsi a permettere/block. Questo post mostra come il risultato della classificazione di StyloBotM SK2 diventi la logica dell'applicazione in ASP .NETMSC4 tag helpers in RazorMST5 filtri d'azione e politiche nei controllerMst6 segnaleMSt7giocamento di livelloM st8 così che l'interfaccia utente possa modellare l'esperienza invece di frenare la frizione dopo il fattoMSST9

StyloBot

StyloBot Release Series

  1. Comportamento, Non identità: perché StyloBot modella i clienti comportamentalmente
  2. Comportamento-Aware ASP.NET UI: il server- restituisce la superficie su quel risultato di rilevamento.
  3. Trovare e riparare la crescita senza limiti nei servizi NET Long-Running .: la disciplina di affidabilità che mantiene il motore noioso nella produzione.
  4. Comportamento-Conoscere l'interfaccia grafica del tipoScript: ExpressM SK1 Fastify, e componenti del browser
  5. L'architettura della Sidecar: come il motore di rilevazione si collega a stack non -.NET
  6. Imparare a diventare più veloce: il sistema di apprendimento adattativo, quattroM SK2 memoria a livello di livello+, e la cassa del verdetto
  7. Provare a fare ciò che non si ferma.: la disciplina di verificazioneM SK1 un file BDF guida la regressione , carico, e calibrazione
  8. StyloExtract - un convertitore locale di HTML per Markdown: l'HTML→Layere Markdown che si combina con il rilevatore , il walkeder bug lucidVIEW catturatoM SK3 e la catena di cibo per cani che lo rende onesto

L'interfaccia grafica di StyloBot è la superficie NET ASP. dello Stylobot' il risultato della rilevazioneM SK2 Il suo lavoro è semplice : rendere disponibili i bot e le classifiche dei rischi dove le applicazioni web ne hanno davvero bisognoMSC4 nelle visuali RazorMST5 i moduliMst6 i controlliMSt7 e i flussi delle pagineMSST8

Introduzione

La maggior parte dei sistemi UX sono ciechi. Rendono la stessa pagina a tutti, poi provano a recuperare più tardi con middlewareM SK2 CAPTCHAs , o un MSC4

Questo post è il secondo annuncio della serie di StyloBot. Comportamento, Non identità copre il modello sotto il sistema. Questo copre la superficie ASPM SK1NET che trasforma quel modello in comportamento di applicazione.

Supponiamo che la rilevazione già esiste. Suppondiamo che la richiesta attuale abbia già un risultato di classificazione collegato a essa. La domanda interessante è cosa può fare l'interfaccia utente mentre la pagina viene costruita?

Questo è quello che l'interfaccia grafica dello StyloBot è per. Rende ASP.NET una superficie pulita sopra il risultato di rilevamento così che la visuale RazorM SK2 i controlli , e i manipolatori della pagina possono usarla direttamenteMSC4

Perciò invece di bollare la frizione dopo il fatto, si può modellare l'esperienza nel tempo di rendering:

  • mostrare contenuti diversi agli umani e ai robot.
  • nascondere l'interfaccia - di alto valore dalle sessioni sospese.
  • aggiungere frizione ai flussi rischiosi prima che diventino abusi.
  • mantenere l'applicazione nei controller mentre la pagina rimane nel contesto-aware

Questo articolo riguarda in particolare l' ASP. NET surface: tag helpersM SK2 page - level gatingMST4 and serverMSSK5 side integrationMSC6 segue Comportamento, Non identità, che spiega il modello comportamentale sottostante. Il prossimo articolo coprerà il JavaScript e il clienteM SK2 superficie laterale .

La superficie ASP.NET

Ecco com'è il comportamento-l'interfaccia cognitiva che appare nel mondo selvatico. Sulla destra in alto del stylobotM SK2il pannello web rende il visitore la propria classificazione inline , nello stesso modo in cui una visuale Razor lo può fare.

La barra superiore del tassboard sul stylobot.net: il conteggio complessivo è sulla sinistraM SK2 e sulla destra "YOUMSC4 L'uomo |0.0% visione sconosciuta | →" composto da sb |- | Badge | , | Sb - | Confidenza | , | e sb

Quella destra-hand cluster è di tre tag helpers (<sb-badge>, <sb-confidence>, <sb-risk-pill>) lettura dello stesso per - risultato di rilevamento della richiesta il controller avrebbeM SK2 Stesi dati, esprimi al tempo di rendereMSC4

L'idea centrale è semplice: la rilevazione non dovrebbe fermarsi a M SK1autorizzare" o "bloccare." In una web appMSC5 dovrebbe essere disponibile all'interfaccia utente stessa

Significa :.

  • Il razor può rendere diversi contenuti per gli esseri umani, bots, e specifici tipi di bot.
  • i moduli possono includere protezioni stratificate come i bicchieri da miele come parte della pagina, non come un sistema di sicurezza separato
  • i controller possono impostare lo stesso risultato di rilevazione dell'UI già usato.
  • La vostra app ASP.NET può reagire a ciò che la richiesta sta facendo, non solo a chi la sessione pretende di essere.

Se volete la storia del motore di rilevamento, che è già coperto in Parte 2 e Parte 3. Questo articolo inizia una stratagemma più alta di quella : una volta che la detezione è già presente, come la si espone pulitamente all' ASP

flowchart LR
    A[Incoming request] --> B[StyloBot middleware]
    B --> C[Risk score bot type and signals]
    C --> D[Tag helpers in Razor]
    C --> E[Controller and page policy]
    D --> F[Different rendered experience]
    E --> G[Allow block challenge or redirect]

Perché questa superficie conta

Senza una superficie UI la rilevazione rimane intrappolata nell'infrastruttura.

Potete registrare un punteggio. Potete forse bloccare una richiestaM SK1 Ma non potete dire facilmente:

  • mostrare il catalogo ma nascondere l'offerta.
  • Rendere il modulo di login in modo diverso per il traffico ad alto rischio.
  • Lasciare che i robot di ricerca vedano crawl- metadati amichevoli senza consegnare ogni segnale commerciale.
  • trattare i crawler dell'AI come una conversazione di concessione piuttosto che come una consegna di un modulo rotto.

Ecco perché la superficie conta. Rende la rilevazione logica dell'applicazione.

A volte la risposta giusta è un blocco.

  • nascondere i codici di sconto dai spazzatori di prezzo.
  • togliere il checkout espresso dalle sessioni a rischio elevate-
  • Servire metadati di ricerca senza esibire segnali commerciali.
  • Discardare silenziosamente le registrazioni di newsletter dall'automazione.
  • aggiungere frizione a login sospetti senza punire gli utenti normali.

Questo è il differenziatore dell'interfaccia utente del StyloBot. Il motore di rilevazione ti dà il verdetto; la superficie ASPM SK2NET ti permette di fare qualcosa di utile con questo a livello della pagina e del flussoMSC3 (Dove quel verdetto viene daMST5 come èMst6s cachedM st7 e perché un'esecuzione sostenibile di richieste da lo stesso cliente costa microsecondi piuttosto che millisecondiMstr8 è coperto in Imparare a diventare più veloce.)

L'esempio di fronte al negozio.

Questo articolo passa attraverso un esempio di ASP.NET Core MVC storefront che usa gli assistenti UI dello StyloBot su sei pagine: la pagina di casaM SK2 la page del prodottoMSC3 il checkoutMST4 l' loginMst5 la Anmeldung al newsletterM st6 e una pagina di autodiagnosiMstr7la pagina di diagnosticaMtr8

L'esempio app è intenzionalmente piccolo: prodotti generati, poche categorieM SK2 checkout , newsletterMST4 e loginMSSK5 Il punto non è la logica del commercioMSC6 il punto è mostrare come la classificazione dei robot diventi una logica dell'applicazioneMSV7

Installare i pacchetti:

dotnet add package Mostlylucid.BotDetection
dotnet add package Mostlylucid.BotDetection.UI

Poi collegate il StyloBot. Program.cs:

builder.Services.AddStyloBot(
    configureDashboard: dashboard =>
    {
        dashboard.BasePath = "/_stylobot";
        dashboard.AllowUnauthenticatedAccess = true; // dev only
    },
    configureDetection: detection =>
    {
        detection.ExcludeLocalIpFromBroadcast = false;
    });

// ...

app.UseStyloBot();
app.MapHub<StyloBotDashboardHub>("/_stylobot/hub");

Questo è sufficiente per iniziare a classificare le richieste e a mostrare il risultato ai controller Razor, , e al Live dashboard. Se volete la storia di integrazione minimaM SK3 La parte 3 la copre in dettaglio..

Un esempio veloce: login come difesa stratificata

La pagina di login è un buon esempio micro, perché mostra l'intero modello in poche linee.

flowchart TD
    A[Request for login page] --> B[Render page]
    B --> C[Bot sees warning]
    B --> D[Form is rendered]
    D --> E[Submission arrives]
    E --> F{Honeypot triggered?}
    F -->|Yes| G[Redirect to LoginDenied]
    F -->|No| H{IsBot?}
    H -->|Yes| G
    H -->|No| I[Authenticate user]
<!-- Layer 1: bots see a deterrent message before the form -->
<sb-bot>
    <div class="alert alert-warning">Automated login attempts are detected and blocked.</div>
</sb-bot>

<form method="post" action="/Account/Login">
    <!-- Layer 2: hidden trap fields - humans leave them blank; bots fill everything -->
    <sb-honeypot prefix="hp" fields="2"></sb-honeypot>

    <input type="email" name="email" />
    <input type="password" name="password" />
    <button type="submit">Sign In</button>
</form>
// Layer 3: server-side final check before any processing
if (HoneypotValidator.IsTriggered(HttpContext) || HttpContext.IsBot())
    return RedirectToAction("LoginDenied");

Il bot vede un avvertimento, poi va in giro per il vaso di miele se lo presenta, poi viene rifiutato dal serverM SK2 se in qualche modo supera le strati precedenti . Ogni strato è piccoloMSC4 Insieme creano una difesa in profondità senza un CAPTCHAMST5la prima esperienza per tuttiMst6

Il resto di questo post estende quell'idea in un negozio realistico.


Il costo di non sapere chi è nel tuo negozio.

Il problema commerciale principale non è "bots" in astratoM SK2 Ma è che diversi tipi di automatizzazione causano diversi tipi d' danni.

Riscaldatori di prezzo. Raccolgono i nomi dei prodotti, i prezziM SK1 le descrizioni, e i dati sul mercato in modo che i competitori possano replicare contro di voi in tempo reale.

Testatori di Gutscheini. Loro bruciano -forziscono spazi di codice a rabaccio finché non trovano codici validi , che poi vengono pubblicati nei forum per i coupon e erodono la margem.

Lavoratori di credenzali. Ripeteno il nome d'utente trascurato-parli di password in scala. Anche i bassi tassi di picchi diventano eventi di takeover account quando il volume è altoM SK2

I crawler di addestramento AI. Hanno raccolto descrizioni, recensioni, e copia editoriale per la formazione del modelloM SK2 Questo non è lo stesso modello di minaccia che un attacchiatore di checkout , ma è ancora l'estrazioneMSC4

I raccoltori di newsletter. Stanno studiando i moduli di Anmeldung per validare le e-mail, liste di posta del velenoM SK1 o per testare le debolezze dell'injezione.

Non sono lo stesso problema, quindi un singolo blocco-la strategia di tutto è l'astratto sbagliato . Il comportamentoM SK3l'aware gating ti permette di rispondere proporzionalmenteMSC4


Page 1: Il pavimento del negozio

La pagina d'accueil è dove molti spazzatori iniziano. Vogliono il catalogo. Vogliate un catalogo usabile per gli umani e indexabile per la ricercaM SK2 ma meno prezioso dal punto di vista commerciale per la raccolta automaticaMSC3

Scenario: un scafo di prezzo colpisce /; vede un messaggio di catalogo neutrale , nessuna copia d'accettatoM SK2 e nessun numero di categorie.

<!-- Human visitors see the welcome message and category count -->
<sb-human>
    <p class="muted">Welcome! Browse @Model.Count products.</p>
</sb-human>

<!-- Bots see a neutral, non-committal message -->
<sb-bot fallback="hide">
    <p class="muted">Product catalogue.</p>
</sb-bot>

<!-- Search engine crawlers get structured metadata, not price data -->
<sb-gate bot-type="SearchEngine">
    <meta name="description" content="@Model.Count products across @categories categories." />
</sb-gate>

<!-- Verified bots (Googlebot etc.) see a specific indicator -->
<sb-gate bot-type="VerifiedBot">
    <div class="alert alert-info">Verified crawler detected. Serving crawl-optimised view.</div>
</sb-gate>

<!-- High-risk sessions see friction before the buy buttons -->
<sb-gate min-risk="High">
    <div class="alert alert-warning">Additional verification may be required at checkout.</div>
</sb-gate>

Questi sono degli indizi da rendere, non controlli di accesso. La pagina funziona ancoraM SK2 Qual è il contesto intorno a lei che cambia . Ciò rende la pagina meno utile per la raccolta sistematica senza degradare l'esperienza del clienteMSC4

Questo è anche il punto in cui la differenziazione dei crawler è importante. Vogliate i prodotti dell'indexazione Googlebot. Potreste non volere che ogni cliente automatizzato riceva la stessa presentazione commerciale di un compratore umanoM SK2 Comportamento -il rendering consapevole vi permette di separare MST4indexabileMSC5 da SST6valuevoleMSL7


La pagina 2: La pagina del prodotto

La pagina dei dettagli del prodotto è dove l'intenzione commerciale diventa esplicita. E' anche dove i spazzatori di prezzo e i cacciatori di buoni cercano i segnali che gli interessano.

Scenario: un spazzadore di prezzo attrae su /Product/Detail/12; non vede un codice di sconto, nessun aggiungimentoM SK2a- bottone di carto , e nessun segnale d'acquisto per agire suMSC5

<!-- Exclusive discount - only shown to low-risk, verified human visitors -->
<sb-gate max-risk="Low">
    <div class="alert alert-success">
        Member discount: use code LOYAL10 for 10% off today.
    </div>
</sb-gate>

<!-- Medium-risk visitors get a friction signal before the cart button -->
<sb-gate min-risk="Medium">
    <div class="alert alert-warning">
        We noticed some unusual activity from your network.
        You can still purchase. You may be asked to verify at checkout.
    </div>
</sb-gate>

<!-- Datacenter/VPN visitors lose the buy button -->
<sb-signal signal="ip.is_datacenter" condition="true">
    <p class="muted">Purchase unavailable from datacenter or VPN networks.</p>
</sb-signal>

<!-- Human-only: the add-to-cart button -->
<sb-gate human-only>
    <form method="post" action="/Cart/Add">
        <button type="submit" class="btn btn-success">Add to Cart</button>
    </form>
</sb-gate>

<!-- Detection mini-card for transparency -->
<sb-summary variant="card"></sb-summary>
<sb-confidence display="bar" width="180px"></sb-confidence>

Ci sono tre modelli utili qui.

Targeting loyalty. Le buone Offerte dovrebbero andare a buone sessioni. Mostrere scaffali solo ai bassiM SK1Il traffico a rischio riduce i rifiuti e riduce la possibilità che gli spazzatori o i bot di voucher sollevano l'offerta.

Frizione progressiva. Medio-il rischio non significa automaticamente "bloccamentoM SK2 reti condiviseMSC3 browser per la privacy , e VPN tutti creano falsi positiviMST5 Un avvertimento spesso salva la vendita meglio di una negazione duraMSV6

Signale-Gating di livello. ip.is_datacenter è un segnale grezzo, non una fascia di rischioM SK1 A volte la politica che ti interessa non è " quanto sia rischioso questo visitatore in generaleMSC3 ma " questa proprietà specifica viola una regola d'affari

Se volete l'architettura dietro questi segnali, La parte 2 copre il tubo di rilevamento in fase..

Questa distinzione passa attraverso il resto dell'esempio: le aree di rischio formano decisioni UX ampi, mentre i segnali individuali affrontano regole politiche più ristretteM SK2


La pagina 3: Checkout

Il checkout è il più alto -obiettivo di valore sul sito . Automatizzazione della frode, test delle carteM SK3 abuso dei voucherMSC4 e ripetizioni scritte tutte convergono quiMST5

Scenario: un voucher-test bot colpisce /Cart/Checkout; vede un mortoM SK1 messaggio finale, invia una vasca da miele - forma completataMSC4 e riceve un accolto silenzioso senza incentivo per riprovareMST5

flowchart TD
    A[Visitor reaches checkout] --> B{Human?}
    B -->|No| C[Show dead-end message]
    B -->|Yes| D{Risk band}
    D -->|Low| E[Express checkout]
    D -->|Elevated| F[Standard payment flow]
    D -->|High or above| G[Alternative path]
    E --> H[POST order]
    F --> H
    G --> H
    H --> I{Honeypot triggered?}
    I -->|Yes| J[Silent accept fake success]
    I -->|No| K[Process real order]
<!-- Gate the entire checkout form on human-only detection -->
<sb-gate human-only>
    <form method="post" action="/Cart/Order">
        @Html.AntiForgeryToken()

        <!-- Honeypot trap fields - invisible to humans, irresistible to bots -->
        <sb-honeypot prefix="co" fields="2"></sb-honeypot>

        <!-- Express checkout only for trusted visitors -->
        <sb-gate max-risk="Low">
            <button type="submit" name="express" value="true" class="btn btn-success">
                Express Checkout
            </button>
        </sb-gate>

        <!-- Standard checkout available up to elevated risk -->
        <sb-gate max-risk="Elevated">
            <button type="submit" class="btn btn-primary">Proceed to Payment</button>
        </sb-gate>

        <!-- High-risk visitors get an alternative path -->
        <sb-gate min-risk="High">
            <p>Please call us to complete your order: 0800 123 456</p>
        </sb-gate>
    </form>
</sb-gate>

<!-- Bots see a dead end, not an error -->
<sb-bot>
    <p class="muted">Checkout is only available to human visitors.</p>
</sb-bot>

E nel controller:

[HttpPost]
public IActionResult Order(OrderModel model)
{
    if (HoneypotValidator.IsTriggered(HttpContext))
    {
        // Silent accept - bot thinks the order succeeded
        return RedirectToAction("Confirmed");
    }

    return ProcessOrder(model);
}

Questa pagina mostra tre tecniche che lavorano insieme.

Discardare il vaso di miele. Se un bot riempie dei campi nascosti, accettate silenziosamente e lasciate perdere la richiesta. La risposta agli errori aiuta gli attacchi a ripetere l'errore ; il silenzio spreca il loro tempoM SK3

Rischio Il guadagno Express è un beneficio di fiducia, non è un diritto di default. Le sessioni sospette possono ancora comprarsiM SK2 ma attraverso un percorso più lento .

Degradazione graziosa. Un messaggio semplice è spesso operativomente migliore di un errore difficile. I bot raramente si preoccupano della prosa; gli operatori e i sistemi di monitoraggio si occupano molto M SK2sMSC3


Page 4: Login

L' Login è un altro tipo di pagina di alto valore-valutaM SK1 l'obiettivo non è l'abuso del cart ma l'accesso al account, che cambia il commercioMSC3offsMST4

Scenario: credenzale- battito dello script /Account/Login; non vede mai la formaM SK1 riempie il vaso di miele, e viene spinto verso LoginDenied.

<!-- High-risk sessions see friction before the form -->
<sb-gate min-risk="High">
    <div class="alert alert-danger">
        High-risk signals detected. Login attempts are logged and may be blocked.
    </div>
</sb-gate>

<!-- Bots see a deterrent message - but the form is still rendered below -->
<sb-bot>
    <div class="alert alert-warning">
        Automated login attempts are detected and blocked.
    </div>
</sb-bot>

<!-- Form is visible to everyone; the honeypot is the second layer -->
<form method="post" action="/Account/Login">
    @Html.AntiForgeryToken()
    <sb-honeypot prefix="hp" fields="2"></sb-honeypot>
    <div class="form-group">
        <label for="email">Email address</label>
        <input type="email" id="email" name="email" autocomplete="email" />
    </div>
    <div class="form-group">
        <label for="password">Password</label>
        <input type="password" id="password" name="password" autocomplete="current-password" />
    </div>
    <button type="submit" class="btn btn-primary">Sign In</button>
</form>

Il controller fornisce il controllo finale:

[HttpPost]
public IActionResult Login(LoginModel model)
{
    if (HoneypotValidator.IsTriggered(HttpContext))
        return RedirectToAction("LoginDenied");

    if (HttpContext.IsBot())
        return RedirectToAction("LoginDenied");

    return Authenticate(model);
}

Il punto chiave è l'assimetria dei costi. Un falso positivo al checkout può perdere una vendita. Un false positivo al login normalmente costa un ritestoM SK2 Un credenzale mancante - un attacco soffocato costa un accountMSC4 Questo significa che questo punto finale può giustificare un impegno più stringenteMNK5


La pagina 5: Newsletter

L'affidamento al newsletter è il punto in cui la gestione del crawler AI diventa particolarmente interessante, perché la risposta giusta spesso non è M SK1block."

scenario: GPTBot colpisce /Newsletter/Subscribe; vede dei dati-un messaggio di licenzione invece di una voce d'affidamentoM SK2 e la sua richiesta di forma viene discesa silenziosamente .

I crawler artificiali non cercano di comprare prodotti o cose brutte-forze accounts. Cercano di raccogliere i messaggiM SK2 Sono spesso onesti riguardo all'identitàMSC3 il che vuol dire che si può rispondere in modo commerciale invece che in modo avverso.

<!-- Human pitch - only visible to real visitors -->
<sb-human>
    <p class="muted">
        Get exclusive deals and discount codes delivered to your inbox.
        Subscribe below. Unsubscribe any time.
    </p>
</sb-human>

<!-- AI crawlers get a licensing message, not a block -->
<sb-gate bot-type="AiBot">
    <div class="alert alert-info">
        This email subscription endpoint is for human readers.
        For data licensing enquiries please contact us directly.
    </div>
</sb-gate>

<!-- Other automated clients get a simpler message -->
<sb-bot>
    <sb-gate bot-type="AiBot" negate="true">
        <div class="alert alert-warning">
            Automated subscription attempts are discarded.
        </div>
    </sb-gate>
</sb-bot>

<!-- The form - visible to everyone, processed differently per visitor type -->
<div class="card">
    <form method="post" action="/Newsletter/Subscribe">
        @Html.AntiForgeryToken()
        <sb-honeypot prefix="nl" fields="3"></sb-honeypot>
        <div class="form-group">
            <label for="email">Your email address</label>
            <input type="email" id="email" name="email" autocomplete="email" />
        </div>
        <button type="submit" class="btn btn-success">Subscribe</button>
    </form>
</div>

E nel controller:

[HttpPost]
public IActionResult Subscribe(string email)
{
    if (HoneypotValidator.IsTriggered(HttpContext) || HttpContext.IsBot())
    {
        // Silent accept: bot thinks it succeeded, no retry incentive
        return RedirectToAction("Thanks", new { real = false });
    }

    _mailingList.Subscribe(email);
    return RedirectToAction("Thanks", new { real = true });
}

L'informazione figura nella parte dispositiva. Thanks la vista può essere identica in entrambi i casi. La parte importante è che il cliente automatizzato non può distinguere il successo da un discard silenzioso.

Questo è anche il tipo di bot più importante. AiBot Non è solo un'altra etichetta ostile.


La pagina 6: La mia scoperta

L'informazione figura nella parte dispositiva. /Me Page is the developer-facing utility pageM SK1 Risponde alla domanda di integrazione pratica: cosa pensa StyloBot che questa richiesta sia , proprio oraMSC4

Scenario: un sviluppatore ha appena implementato StyloBot e vuole verificare che le sessioni del browser abbiano un punteggio umano. curl punte come bot.

<!-- Full detection panel: confidence, risk, reasons, contributing detectors -->
<bot-detection-details collapsed="false"></bot-detection-details>

<!-- Individual components for custom layouts -->
<sb-badge variant="full"></sb-badge>
<sb-confidence display="both" width="100%"></sb-confidence>
<sb-risk-pill></sb-risk-pill>
<sb-summary variant="card"></sb-summary>

Quello. <bot-detection-details> il panel è quello che stylobot.net rende sulla propria pagina di casa. Lo stesso componenteM SK2 lo stesso tag Razor , traffico reale registratoMSC4

bot-detectionM SK1panele di dettagli mostrata su stylobot.netMNK3 Live MRK4 La vostra rilevazione con il radar , MNK6 probabilità del robotMMK7 VeryLow riskMEK8 Permettete la politicaMBK9 tre rilevatori che contribuisconoMDK10 Top Bots panel below listing real recorded bots

E attraverso il HttpContext extension API:

ViewBag.IsBot       = HttpContext.IsBot();
ViewBag.IsHuman     = HttpContext.IsHuman();
ViewBag.Probability = HttpContext.GetBotProbability();
ViewBag.RiskBand    = HttpContext.GetRiskBand();
ViewBag.BotType     = HttpContext.GetBotType();
ViewBag.BotName     = HttpContext.GetBotName();
ViewBag.Reasons     = HttpContext.GetDetectionReasons().ToList();

Per simulare diverse classificazioni durante lo sviluppo:

# Simulate a search engine crawler
curl -H "ml-bot-test-mode: googlebot" http://localhost:5200/Me

# Simulate a high-risk scraper
curl -H "ml-bot-test-mode: scraper" http://localhost:5200/Me

# Real browser (Playwright, Chrome, etc.) scores as human

Insieme EnableTestMode: true Si tratta di un sistema basato su una classificazione basata sulla classificazione. appsettings.Development.json se volete che quei titoli siano onorati.


Il modello dell'aiuto della targhetta.

StyloBot UI è piccolo a scopo. I primitivi sono semplici; le combinazioni sono dove arriva la flessibilitàM SK2

Aiutatore di targhette Role Attributi chiave S
<sb-human> Rendere solo per gli umani fallback (" mostrareM SK1 nascondere " quando non è classificata; predefinitoMST4 mostrarloM ST5 SST6
<sb-bot> Rendere solo per i robot fallback (defaultM SK1 nascondere)
<sb-gate> MultiM SK1Gate di condizionamento vediamo sotto
<sb-signal> Tora segnale unica da lavagna signal, condition, value, fallback, negate
<sb-honeypot> campi di trappola invisibili prefix, fields (1-3; predefinitoM SK1 2)
<sb-badge> chip di stato di rilevamento variant ("
<sb-confidence> Bar di probabilità del bot display ("barM SK1test"/" entrambiMSC3 width
<sb-risk-pill> Rischio band label nessuna
<sb-summary> Carta di rilevamento Compacta variant ("inline
<bot-detection-details> Detezione completa collapsed (bool), view ("defaultM SK1compact")

<sb-gate> è il cavallo di lavoro generico-purpose workhorse:

<sb-gate human-only>...</sb-gate>
<sb-gate bot-only>...</sb-gate>
<sb-gate verified-only>...</sb-gate>
<sb-gate max-risk="Low">...</sb-gate>
<sb-gate min-risk="Medium">...</sb-gate>
<sb-gate bot-type="SearchEngine,VerifiedBot">...</sb-gate>
<sb-gate bot-type="AiBot" negate="true">...</sb-gate>
<sb-gate max-risk="Low" fallback="hide">...</sb-gate>

Bande di rischio in ordine: VeryLow, Low, Elevated, Medium, High, VeryHigh, Critical.

<sb-signal> i cancelli direttamente sui segnali di cartone nero. condition Attributo accetta exists, not-exists, true, false, equals, not-equals, gt, lt, gte, lte, contains, any-true, e all-true.

<sb-signal signal="ip.is_datacenter" condition="true">...</sb-signal>
<sb-signal signal="detection.probability" condition="gte" value="0.8">...</sb-signal>

L'importante scelta di progettazione è che questi assistenti si occupano di rendere, non bloccare. permettono alla vostra applicazione di esprimere la politica nell'interfaccia grafica senza trasformare ogni incertezza in una negazione.

Attributi del Controller e della pagina Razor

Per il server-Implementazione laterale, StyloBot espone anche i filtri d'azione e gli attributi della paginaM SK2 Se la stratagemma UI è MSC3 mostrare qualcosa di diverso ," questa stratagemmia è ♫" fare qualcosa di differenteSSK6

[BlockBots] restituisce 403 per il bot-questioni classificateM SK2 con liste di possibilità opzionali .

[BlockBots]                                                         // block everything
[BlockBots(AllowSearchEngines = true)]                              // let Googlebot through
[BlockBots(AllowSearchEngines = true, AllowSocialMediaBots = true)] // SEO + social previews
[BlockBots(BlockCountries = "CN,RU", BlockVpn = true)]              // geo + network enforcement

Permettete le bandiere: AllowVerifiedBots, AllowSearchEngines, AllowSocialMediaBots, AllowMonitoringBots, AllowAiBots, AllowGoodBots, AllowScrapers, AllowMaliciousBots, AllowTools.

bandiere della rete: BlockCountries, AllowCountries, BlockVpn, BlockProxy, BlockDatacenter, BlockTor.

[RequireHuman] è più stringente di quanto non lo sia. [BlockBots]; solo le richieste classificate come umani sono autorizzate attraverso.

[AllowBots] Esclude un'azione da un controller-level [BlockBots].

[BlockBots]
public class AccountController : Controller
{
    public IActionResult Login() { }          // blocked

    [AllowBots]
    public IActionResult HealthCheck() { }    // passes through
}

[BotPolicy("name")] applica una politica chiamata, con un punto finale opzionaleM SK1overrides di livello.

[BotPolicy("strict")]
[BotPolicy("strict", BlockThreshold = 0.75, MinConfidence = 0.85, ActionPolicy = "throttle-stealth")]

[BotDetector("names")] conduce rilevatori specifici inline senza definire una politica completa.

[BotDetector("UserAgent,Header,Ip", BlockThreshold = 0.8)]

[BotAction("name")] cancella la risposta dell'azione senza cambiare la politica di rilevamento.

[BotPolicy("default")]
[BotAction("challenge-captcha", FallbackAction = "block")]
public IActionResult Checkout() { }

[BlockIfSignal] e [RequireSignal] Porta su singoli segnali di lavagna.

[BlockIfSignal("ip.is_datacenter")]
[RequireSignal("geo.country_code", Value = "GB")]

[SkipBotDetection] bypasse la rilevazione interamente per controlli sanitari e punti finali di misurazione.

Espansioni del HttpContext

Tutti i dati di classificazione sono disponibili direttamente nei controller, Razor Pages, e Minimal APIs :

// Classification
bool isBot      = HttpContext.IsBot();
bool isHuman    = HttpContext.IsHuman();
bool isVerified = HttpContext.IsVerifiedBot();
bool isSearch   = HttpContext.IsSearchEngineBot();

// Scores
double prob       = HttpContext.GetBotProbability();   // 0.0 - 1.0
double conf       = HttpContext.GetBotConfidence();
RiskBand risk     = HttpContext.GetRiskBand();         // VeryLow ... Critical
ThreatBand threat = HttpContext.GetThreatBand();       // None ... Critical

// Bot identity
BotType? type = HttpContext.GetBotType();
string?  name = HttpContext.GetBotName();

// Network
bool isDc  = HttpContext.IsDatacenter();
bool isVpn = HttpContext.IsVpn();
string? cc = HttpContext.GetCountryCode();

// Raw signals (blackboard passthrough)
T? val = HttpContext.GetSignal<T>("ip.is_datacenter");

// Recommended action
bool allow   = HttpContext.ShouldAllowRequest();
bool block   = HttpContext.ShouldBlockRequest();
bool captcha = HttpContext.ShouldChallengeRequest();

In un punto di fine Minimale API:

app.MapPost("/api/order", (HttpContext ctx, OrderModel order) =>
{
    if (ctx.IsBot() || ctx.GetRiskBand() >= RiskBand.High)
        return Results.Forbid();

    return Results.Ok(ProcessOrder(order));
});

Aiutitori di targhetta e metodi di estensione leggiati dallo stesso per- risultato di rilevamento della richiesta, quindi non c'è un secondo passaggio di rilevazione solo perché l'UI lo consumaM SK2


Cosa mostra il pannello?

Il pannello di controllo a /_stylobot è la vista operativa dal vivo:

  • impronte digitali: visitatori distinti da un'impronta digitale composta
  • Bot %: proporzione di traffico classificato per bot- per ogni punto finale
  • Dividere la barra: umanoM SK1 rapporto con il robot per ogni punto finale
  • Il vostro pannello di rilevazione: come è stata classificata la sessione attuale, inclusi i motivi e i rilevatori che hanno contribuito

/_stylobot dashboard su una installazione dal vivo: conteggi complessi nel titolo, traffic over timeM SK2 Live Activity by signature MST3humans and botsM ST4 classificato per il numero di colpiMst5 e il tavolo Endpoints con perM st6route bot pressureMSt7 threatMstr8 latencyMr9 and split bars

Le colonne di divisione sono particolarmente utili nella pratica. Una pagina di prodotti che tende fortemente ad essere un bot- la maggior parte è probabilmente spazzata viaM SK2 Un punto di fine per l' login o il checkout che diventa rosso viene spesso testato dall'automazione molto prima che gli utenti si lamentano.

Se volete il modello a livello inferiore- dietro queste impronte digitali e i vettori comportamentali, che è coperto nel primo post in questa serie di presentazioniM SK2 Comportamento, Non identità.


Il caso one-line per il comportamento-aware UX

Blocco/autorizzare è un interruttoreM SK1 Comportamento-aware UX è un dialMSC3

Un interruttore trasforma l'incertezza in dolore: falsi positivi perdono i clienti e falsi negativi lasciano perdere il valore. un pulsante ti permette di modellare l'esperienza inveceM SK2 puoi nascondere le offerteMSC3 i flussi lenti , rimuovere quelli altiMST5 scorciatoie di fiduciaM ST6 presentare percorsi alternativiM st7 e riservare il blocco duro per i casi che lo giustificano in realtàMst8

Ecco cos'è l'interfaccia grafica di StyloBot. La rilevazione diventa disponibile presto nella richiesta, poi la vostra applicazione decide cosa dovrebbe significare per la paginaM SK2 il flussoMST3 e il risultatoMSST4

Il prossimo nella serie di release: Trovare e riparare la crescita senza limiti nei servizi NET Long-Running ., il ritocco di affidabilità che ha trasformato lo StyloBot, la strata di somiglianza dei vectori, da una bomba temporale di GB LOH a qualcosa che si può lasciare andare su un Pi indefinitamente. Comportamento-Conoscere l'interfaccia grafica del tipoScript prende lo stesso risultato di rilevazione in Express, Fastify, e nel browser per il clienteM SK2 Adaptazione lateraleMSC3

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.