La détection des bottes ne doit pas se terminer par permettre/bloc. Ce post montre comment le résultat de la classification du StyloBot ' devient une logique d’application dans ASPMSC3NETM SK4 les aides à l’étiquetage dans RazorMNK5 les filtres d’action et les politiques dans les contrôleurs MNK6 le signalMRK7 le gating de niveauMMK8 afin que votre UI puisse façonner l’expérience au lieu de freiner la friction après le fait
StyloBot Release Series
- Comportement, Non identité: pourquoi StyloBot modele les clients de façon comportementale
- Behaviour-Aware ASP.NET UI: le serveur - remet la surface sur ce résultat de détection
- Trouver et rétablir une croissance sans limites dans les services longs-Running .NET: la discipline de fiabilité qui maintient le moteur borne dans la production
- Behaviour-Aware TypeScript UI: ExpressM SK1 Fastify, et composants de navigateur
- L'architecture de la Sidecar: comment le moteur de détection se connecte aux piles NET non -.
- Apprentissage pour devenir plus rapide: le système d'apprentissage adaptatif , quatre- mémoire de niveauM SK3 et cache des verdicts
- Étudier ce qui ne va pas se tenir: la discipline de vérification : un fichier BDF conduit à la régressionM SK2 charge, et à l'étalonnage
- StyloExtract - un convertisseur HTML d'apprentissage local à Markdown: la couche de marquage HTML→ qui se joigne au détecteur , le bug lucidVIEW du fauteuil roulant qui a capté l’image
L'interface du StyloBot est la surface ASP.NET sur le Stylobot'le résultat de détectionM SK2 Son travail est simple : rendre disponible un bot et une classification des risques là où les applications Web en ont réellement besoin
La plupart des systèmes UX sont aveugles.
Ce post est la deuxième entrée dans la série de sortie StyloBot. Comportement, Non identité couvre le modèle sous le système. Ce dernier couvre la surface ASP.NET qui transforme ce modèle en comportement d’applicationM SK2
Supposons que la détection existe déjà. Supporons que la demande courante a déjà un résultat de classification attaché à celle-ci
C'est ce que l'interface de StyloBot est pour. Il donne à ASP.NET une surface propre sur le résultat de détection afin que les vues RazorM SK2 les contrôleurs , et les gestionnaires de page puissent l'utiliser directement
Par conséquent, au lieu de freiner la friction après le fait, vous pouvez façonner l’expérience en temps de render:
Cet article traite spécifiquement de ce qui suit : ASP.surface NET:aides à l'affichage des balises , pageM SK3répartition du niveauMST4 et serveurMSSK5intégration des côtésMSC6 Comportement, Non identité, qui explique le modèle comportemental sous-jacent à celui-ci . L'article suivant traite du JavaScript et du clientM SK2surface latérale.
C’est ainsi que le comportement apparaît dans l’interface aware du styleobot.

À droite, le groupe de main - est composé de trois aides à l’étiquetage (<sb-badge>, <sb-confidence>, <sb-risk-pill>) lecture à partir du même résultat par -détection de la demande le contrôleur ferait. Les mêmes donnéesM SK3 exprimées au moment de la traductionMSC4
L’idée de base est simple : la détection ne devrait pas se terminer à "allow" ou "blockM SK4 Dans une application Web, elle doit être disponible pour l’interface elle-même.
Cela signifie
Si vous voulez l’histoire du moteur de détection, qui est déjà couvert dans Partie 2 et Partie 3. Cet article commence une couche au-dessus de celle-ci: une fois que la détection est déjà sur place , comment l'exposer de façon propre à 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]
Sans une surface d’interface, la détection demeure piquée dans l’infrastructure.
Vous pouvez enregistrer un score. Vous pouvez peut-être bloquer une demandeM SK1 Mais vous ne pouvez pas facilement dire:
C'est pourquoi la surface est importante. Il transforme la détection en logique d'application.
Parfois, la bonne réponse est un bloc.
C'est le différenciateur de l'interface de StyloBot. Le moteur de détection vous donne le verdict ; la surface ASP.NET vous permet d'y faire quelque chose utile au niveau de page et de fluxM SK3 MSC4 Là où ce verdict provient deMST5 comment il est cached MST6 Mst7 et pourquoi une exécution soutenue des demandes du même client coûte microsecondes plutôt que millisecondesMst8 est couvert par Apprentissage pour devenir plus rapide.)
Cet article passe par un échantillon ASP.NET Core MVC storefront qui utilise des aides à l'interface de StyloBot sur six pages.
L'application de l'échantillon est intentionnellement petite: produits générésM SK1 quelques catégories , sortie de commandes, bulletin d'informationMSC4 et loginMNK5 Le point n'est pas la logique commercialeMST6 Ce point montre comment le classement des robots devient une logique d'applicationMSP7
Installer les paquets:
dotnet add package Mostlylucid.BotDetection
dotnet add package Mostlylucid.BotDetection.UI
Ensuite, connectez le StyloBot à l'intérieur 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");
Cela suffit pour commencer à classer les demandes et à exposer le résultat aux contrôleurs Razor, , et au tableau de bord en direct. Si vous voulez l’histoire d’intégration minimaleM SK3 La partie 3 couvre ce point en détail..
La page d’inscription est un bon exemple micro, car elle montre le modèle dans quelques lignes.
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");
Le robot voit un avertissement, puis se déplace dans la poêle de miel s’il soumet, puis obtient le serveur rejeté - si il passe par les couches antérieures d’une manière ou d’autreMSC3 Chaque couche est petiteM SK4 Ensemble, ils créent une défense en profondeur sans CAPTCHAMST5première expérience pour tousMst6
Le reste de ce post élargit cette idée au-delà d’un magasin réaliste
Le principal problème commercial n’est pas "bots" dans l’abstractM SK2 Il est que les différents types d’automatisation causent des dommages de différentes sortes.
Écraseurs de prix. Ils récoltent les noms de produits, prixM SK1 descriptions, et données sur les stocks afin que les concurrents puissent vous reproduire en temps réel.
Essais de chèques. Ils brutalisent les espaces de code à rabais jusqu’à ce qu’ils trouvent des codes valides, qui sont ensuite affichés sur les forums de coupons et érodent la marge.
Enregistreurs de crédibilité. Ils répètent les noms d’utilisateurs détournés-parmes de mots de passe à l’échelle. Même les taux de frappe faibles deviennent des événements de prise en compte lorsque le volume est élevéM SK2
Les crawleurs de formation AI. Ils récoltent des descriptions, examens , et une copie éditoriale pour la formation du modèle. Ce n’est pas le même modèle de menace que celui d’un attaquant à l’échelon du checkoutM SK3 mais il s’agit encore d’une extraction
Harvesters de bulletins. Ils étudient les formulaires d’inscription pour valider les adresses électroniques, listes de diffusion des poisons , ou pour vérifier les faiblesses liées à l’injection.
Il ne s’agit pas du même problème.
La page d’accueil est là où commencent de nombreux écrappers. Ils veulent le catalogue. Vous voulez un catalogue utilisable pour les humains et indexable à la rechercheM SK2 mais moins utile sur le plan commercial pour l’élevage automatisé .
Scénario: un affaiblissement des prix frappe /; il voit un message de catalogue neutre , aucune copie de bienvenueM SK2 et aucun nombre de catégories.
<!-- 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>
Il s’agit de donner des conseils, non de contrôles d’accèsM SK1 La page fonctionne toujours. Quel est le contexte qui entoure-t-elle? . Cela rend la page moins utile pour une récolte systématique sans dégrader l’expérience du clientMSC4
C'est aussi là où la différenciation des crawleurs est importante. Vous voulez bien les produits indexés par Googlebot. Vous ne voudrez peut-être pas que chaque client automatisé reçoive la même présentation commerciale qu'un acheteur humain.
La page de détail du produit est là où l’intention commerciale devient explicite. C’est aussi là que les écrasiers des prix et les chasseurs aux bons cherchent les signaux dont ils s’intéressent.
Scénario: un écrasateur de prix atterre sur /Product/Detail/12; il ne voit pas de code d'actualisation , aucun ajout-àM SK3 bouton de cartoucheMST4 et aucun signal d'achat pour agir surMSC5
<!-- 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>
Trois modèles utiles apparaissent ici.
Ciblage de loyauté. De bonnes offres devraient aller à de bonnes sessions. En montrant des rabais seulement aux faiblesM SK1 le trafic risque réduit les déchets et réduit la probabilité que les scrapers ou les bots de coupons retirent l’offre.
Friction progressive. Moyenne-le risque ne signifie pas automatiquement M SK1bloc."Les réseaux partagésMSC3les navigateurs de protection des renseignements personnels , et les VPNs créent tous des fausses réponses positives. Une mise en garde préserve souvent la vente mieux que le refus forcéMNK6
Signale-gatage de niveauM SK1 ip.is_datacenter est un signal brut, pas une bande de risqueM SK1 Parfois, la politique à laquelle vous accordez attention n’est pas "de quelle façon le visiteur est-il risqué dans l’ensemble
Si vous voulez l'architecture derrière ces signaux, La partie 2 couvre le pipeline de détection par étapes.
Cette distinction s’applique au reste de l’échantillon.
La vérification est la plus importante - cible de valeur sur le site . automatisation des fraudes
Scénario: un bon d'achatM SK1 coupures de bots testés /Cart/Checkout; il voit un message mortM SK1 message de fin , soumet une poêle d’herbe- formulaire rempliMSC4 et obtient une acceptation silencieuse sans incitatif à la renouvellement.
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>
Et dans le contrôleur:
[HttpPost]
public IActionResult Order(OrderModel model)
{
if (HoneypotValidator.IsTriggered(HttpContext))
{
// Silent accept - bot thinks the order succeeded
return RedirectToAction("Confirmed");
}
return ProcessOrder(model);
}
Cette page montre trois techniques qui travaillent ensemble.
Rejet d'un récipient de miel. Si un bot remplit des champs cachés, vous acceptez silencieusement et rejettez la demande. le rétroaction d'erreur aide les attaquants à iterer ; le silence gaspille leur tempsM SK3
Risque1 L’expédition rapide est un avantage de confiance, non pas droit par défaut . Les séances suspectes peuvent encore être achetées, mais sur une voie plus lenteM SK3
Dégradation gracieuse. Un message simple est souvent plus efficace sur le plan opérationnel qu’un erreur difficile.
L’adhésion est un autre type de page à valeur élevée.
Scénario: un certificat de crédibilité - attaques d’un script /Account/Login; il ne voit jamais la forme , remplit le récipient de miel 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>
Le contrôleur fournit le contrôle final:
[HttpPost]
public IActionResult Login(LoginModel model)
{
if (HoneypotValidator.IsTriggered(HttpContext))
return RedirectToAction("LoginDenied");
if (HttpContext.IsBot())
return RedirectToAction("LoginDenied");
return Authenticate(model);
}
Le point clé est l’asymétrie des coûts. Un faux positif à la sortie peut perdre une vente . Un Faux positif au moment de l’enregistrement coûte habituellement un retry. Un certificat manquant de crédibilitéM SK3 le fait d’affecter un compte coûte une attaqueMSC4 Cela signifie que ce point final peut justifier une application plus rigoureuseMNK5
L’inscription au bulletin est là où la manipulation du crawler AI devient particulièrement intéressante, parce que la bonne réponse n’est souvent pas M SK1block."
Scénario: GPTBot frappe /Newsletter/Subscribe; il voit un message de licence au lieu d’un pitch d’abonnement , et sa présentation de formulaire est discardée silencieusement
Les crawleurs AI ne cherchent pas à acheter des produits ou des comptes bruts.
<!-- 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>
Et dans le contrôleur:
[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'article 5 de la Loi sur l'immigration et le statut des réfugiés Thanks la vue peut être identique dans les deux cas. La partie importante est que le client automatisé ne peut pas distinguer le succès d’un rejet silencieux.
C’est aussi là où le type de robot est le plus important. AiBot n’est pas seulement un autre étiquette hostile. Il s’agit d’une classification qui peut déclencher une réaction de l’entreprise :
L'article 5 de la Loi sur l'immigration et le statut des réfugiés /Me page is the developer-facing utility pageM SK1 It answers the practical integration question: what does StyloBot think this request is?
Scénario: un développeur vient de mettre en place StyloBot et veut vérifier que les sessions du navigateur donnent des résultats humains. curl scores as 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>
Que <bot-detection-details> panel is what stylobot.net renders on its own home page. Same componentM SK2 same Razor tag , real recorded trafficMSC4

Et par le biais du 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();
Simulation de différentes classifications au cours du développement:
# 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
Établissement EnableTestMode: true dans appsettings.Development.json si vous voulez que ces titres soient honorés.
StyloBot UI est petit à but. Les primitives sont simples ; les combinaisons sont là où la souplesse provient de.
| Aideur à l'étiquetage | Rôle MSC2 Attributes clés MSC3 | |
|---|---|---|
<sb-human> |
Rendre uniquement pour les humains | fallback ("montrerM SK1 dissimuler " lorsque non classé; par défautMST4 montrerMSS5 SSS6 |
<sb-bot> |
Rendre uniquement pour les bots | fallback (defaultM SK1 dissimuler) |
<sb-gate> |
Multi | |
<sb-signal> |
Porte de signalisation monoblocage | signal, condition, value, fallback, negate |
<sb-honeypot> |
Champs de piège invisibles | prefix, fields (1-3; par défaut |
<sb-badge> |
Équipe de détection de l'état | variant ("fullM SK1compact"/"iconMSC3 |
<sb-confidence> |
Bar de probabilité des bottes | display ("barMSC1texte"/"bothM SK3 width |
<sb-risk-pill> |
Étiquette de bande à risque | aucune MSC2 |
<sb-summary> Carte de détection compacte |
variant ("inlineM SK1card") |
|
<bot-detection-details> |
Ventilation complète de la détection | collapsed (boolM SK1 view ("defaultM SK1compact") |
<sb-gate> est le chevaucheur général
<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>
Bandes de risque en ordre: VeryLow, Low, Elevated, Medium, High, VeryHigh, Critical.
<sb-signal> les portes directement sur des signaux de panneau noir bruts. condition attribute accepte exists, not-exists, true, false, equals, not-equals, gt, lt, gte, lte, contains, any-true, et 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'important choix en matière de conception est que ces aidants visent à rendre les enregistrements non bloqués. Ils permettent à votre application d'exprimer sa politique dans l'interface sans transformer chaque incertitude en refus.
Pour le serveur-exécution par la partie de l'interface, StyloBot expose également les filtres d'action et les attributs des pagesM SK2 Si la couche UI est "montrer quelque chose de différenteMSC4 cette couche est ♫" faire quelque chose d'autreMNK6
[BlockBots] retourne 403 pour le botM SK1requêtes classifiées , avec des listes d'autorisation facultatives.
[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
Permettre les drapeaux: AllowVerifiedBots, AllowSearchEngines, AllowSocialMediaBots, AllowMonitoringBots, AllowAiBots, AllowGoodBots, AllowScrapers, AllowMaliciousBots, AllowTools.
Flags de réseau: BlockCountries, AllowCountries, BlockVpn, BlockProxy, BlockDatacenter, BlockTor.
[RequireHuman] est plus stricte que [BlockBots]; seules les demandes classées à titre humain sont autorisées par l’entremise de.
[AllowBots] exempte une action d’un contrôleur-level [BlockBots].
[BlockBots]
public class AccountController : Controller
{
public IActionResult Login() { } // blocked
[AllowBots]
public IActionResult HealthCheck() { } // passes through
}
[BotPolicy("name")] applique une politique désignée, avec un point final facultatifM SK1surrides de niveau.
[BotPolicy("strict")]
[BotPolicy("strict", BlockThreshold = 0.75, MinConfidence = 0.85, ActionPolicy = "throttle-stealth")]
[BotDetector("names")] exploite des détecteurs spécifiques en ligne sans définir une politique complète.
[BotDetector("UserAgent,Header,Ip", BlockThreshold = 0.8)]
[BotAction("name")] supprime la réponse à l’action sans changer la politique de détection.
[BotPolicy("default")]
[BotAction("challenge-captcha", FallbackAction = "block")]
public IActionResult Checkout() { }
[BlockIfSignal] et [RequireSignal] entrée sur des signaux individuels de panneau noir.
[BlockIfSignal("ip.is_datacenter")]
[RequireSignal("geo.country_code", Value = "GB")]
[SkipBotDetection] parpasse la détection entièrement pour les contrôles de santé et les paramètres métriques.
Toutes les données relatives à la classification sont disponibles directement dans les contrôleurs, Pages de razorM SK1 et API minimales:
// 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();
Dans un point final minimal de l’API:
app.MapPost("/api/order", (HttpContext ctx, OrderModel order) =>
{
if (ctx.IsBot() || ctx.GetRiskBand() >= RiskBand.High)
return Results.Forbid();
return Results.Ok(ProcessOrder(order));
});
Les aides aux balises et les méthodes d'extension sont lues à partir du même résultat de détection par demande.
Le tableau de bord à /_stylobot est la vue opérationnelle en direct:

Les barres divisées sont particulièrement utiles dans la pratique. Une page de produit qui fait fortement l’objet d’une tendance bot- la majorité est probablement en train d’être déclasséeM SK2 Un point d’entrée ou de sortie rouge est souvent testé par l’automatisation longtemps avant que les utilisateurs ne se plaignent .
Si vous voulez le modèle de niveau inférieur- derrière ces empreintes digitales et vecteurs de comportementM SK1 qui est couvert dans la première rubrique de cette série de mise à jour: Comportement, Non identité.
Block/allow est un interrupteur.Comportement -aware UX est un dialM SK3
Un interrupteur transforme l’incertitude en douleur: les faux positifs perdent leurs clients et les fausses négatifs détruisent leur valeur . un dial vous permet de façonner l’expérience au lieu de celle-ci M SK2 Vous pouvez cacher des offres , des flux lentesM SK4 éliminer le niveau élevé
C'est ce que l'interface de StyloBot est pour.
Suivant dans la série de sortie: Trouver et rétablir une croissance sans limites dans les services longs-Running .NET, le réaménagement de la fiabilité qui a transformé StyloBot' sa couche de similitude vectorale d’une bombe à temps de GB LOH 13 en quelque chose que vous pouvez laisser fonctionner sur un Pi indéfiniment M SK3 Après cela Behaviour-Aware TypeScript UI prend le même résultat de détection dans Express, Fastify, et le navigateur pour le clientM SK2 Adaptation latérale .
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.