StyloBot' su motor de detección es ASPM SK1NET Core. Este post explica cómo ese motor se conecta a las gateways de Go , Node M SK4 aplicaciones js , y cualquier otra pila a través de una carretilla lateral gRPC
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
github.com/scottgal/stylobot-goEl Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.github.com/scottgal/caddy-stylobotplugin, y elMostlylucid.BotDetection.Sidecarii) En el párrafo 2 de la parte dispositiva del proyecto de resolución A/C.3/60/L.39, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación de las recomendaciones formuladas por la Comisión Consultiva en Asuntos Administrativos y de Presupuesto; Todo lo que aparece a continuación describe la superficie que expondrán.
StyloBot Release Series
- El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.: por qué StyloBot modela a los clientes de forma behavioural
- El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la protección de los derechos humanos y las libertades fundamentales de todos los trabajadores migratorios y de sus familiares.: el servidor-la superficie entregada para las aplicaciones .NET
- El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos desglosados por sexo, edad y origen étnico sobre las medidas adoptadas para eliminar la discriminación contra la mujer.: la disciplina de fiabilidad que mantiene el motor aburrido en la producción
- El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General sobre la aplicación de las recomendaciones contenidas en el documento A/CN.9/WG.VI/WP.39, que figura a continuación:El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la protección de los derechos humanos y las libertades fundamentales de todos los trabajadores migratorios y de sus familiares.
- **El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.**El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
- Por consiguiente, el Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo.El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
- En el párrafo 6 de su resolución 57/270 B, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación del Programa de Acción para prevenir, combatir y eliminar el tráfico ilícito de armas pequeñas y ligeras en todos sus aspectos.: la disciplina de verificación : un fichero BDF conduce a regresiónM SK2 carga, y calibración
- StyloExtract - un programa local de aprendizaje HTML para convertir Markdown: el HTMLM SK1Layer de marcaje que se combina con el detector, la walker bug lucidVIEW capturada , y el circuito dogfood que lo hizo honesto
Un proxy inversa es el lugar obvio para ejecutar la detección del bot: se encuentra delante de todo, ve todas las peticiones , y puede bloquear antes de que cualquier código de aplicación ejecuteM SK3 Esta lógica se mantiene hasta que te preguntas qué debe hacer tu aplicación El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. basándose en quién está haciendo la solicitud. Una puerta que bloquea directamente es una puerta; lo que la mayoría de las aplicaciones realmente necesitan es un veredicto sobre el cual pueden actuar de varias maneras al mismo tiempo : arrojar la APIM SK3 personalizar la UIMSC4 excluir el tráfico de las analyticasMska5 añadir un paso de fricción a la facturaciónM Ska6 Una porta no puede hacer nada de esoMSKA7 Una red de veredictos puedeMske8
El modelo de autopista separa las dos preocupaciones. La puerta permanece rápida y sin estado. El autopista mantiene el estado de sesiónM SK2 anclas arquetípicas , estado de flujoMSC4 y caché de verificación que hacen la detección exacta MST5el arquetipo MST6modelo de anclaM ST7 el perM st8cache de versión de huellas digitalesMst9 y los cuatroM St10 sistemas de aprendizaje están cubiertos en Por consiguiente, el Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo.). Los dos comunican a través de la red local (el mismo host o el mismo Pod), por lo que la ruta redondaM SK3está a microsegundos hasta un soloMSC4digit millisecondesMST5 no es el SSK6ms de una llamada API remotaMst7 Ese presupuesto de latencia es lo que hace que la detección de pedidos sea práctica en absolutoM st9
No es un modelo nuevo. La Comisión Consultiva en Asuntos Administrativos y de Presupuesto examinó el proyecto de presupuesto por programas para el bienio 2008-2009 (A/60/6 (Sect. El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General sobre la aplicación de las recomendaciones contenidas en el párrafo 6 supra. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de acceso a los servicios de salud reproductiva, incluida la educación sexual y reproductiva. El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos desglosados por sexo, edad y origen étnico. El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General (A/CN.9/WG.VI/WP.21) y de las recomendaciones que figuran en él. ¿lo hace para la telemetría. LinkerdM SK1 Consul Connect, y AWS App Mesh todos siguen el mismo modelo . El patrón sigue apareciendo porque resuelve un problema real
La alternativa consiste en compilar la detección directamente en la puerta de entrada. Para Go significa una reimplementación pura-Go o una conexión CGo a una biblioteca CM SK2 Para Node significa ejecutar la detección en el procesoMSC3 junto con la aplicaciónMスク4
Tampoco es realista para un motor de esta complejidad. StyloBot tiene 49 detectores organizados en cuatro ejecucións. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la asignación de recursos suficientes a la educación y la formación profesional. (Las ondas posteriores disparan sólo cuando los señales anteriores lo justifiquenM SK1 una credencial -la tentación de alimentar desencadena detectores diferentes que un crawl del Googlebot Los vectores de la cadena Markov en un espacio 129-dimensional. Una cadena Markov es sólo un modelo de probabilidad sobre "da la última cosa que esta sesión ha hecho El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. sobre estos vectores: un gráfico-algoritmo de fragmentación que agrupa sesiones que se comportan de la misma manera , lo cual es el modo en que StyloBot detecta una red de bots incluso cuando las sesiones individuales se parecen bienM SK3 Y persiste todo esto a SQLite entre las peticionesMST4 Este estado necesita un ciclo de vida independienteMSC5 No puede reiniciar con el proceso de los nódulos o quedarse desarraigado cuando la puerta reinicia su configuraciónMSSK6
Un coche lateral permite a cada componente hacer lo que es bueno en:
graph TD
classDef input fill:none,stroke:#3b82f6,stroke-width:2px
classDef async fill:none,stroke:#a855f7,stroke-width:2px
classDef good fill:none,stroke:#22c55e,stroke-width:2px
classDef store fill:none,stroke:#f59e0b,stroke-width:2px
GW["Gateway<br/>Caddy / YARP / nginx"]:::input
SD["StyloBot Sidecar · ASP.NET Core<br/>gRPC :5090 · REST :5091<br/>≤50ms per Detect RPC"]:::async
APP["Upstream Application<br/>Node / Go / ASP.NET<br/>reads req.stylobot.verdict"]:::good
DB[("SQLite<br/>sessions · signatures · reputation")]:::store
GW --> SD
SD <--> DB
GW --> APP
El portal llama a la sidecar, inyece el resultado como encabezamientos HTTP, y bloquea opcionalmenteM SK2 La aplicación ascendente lee los encabezamientoים y actúa sobre el veredicto . La sidecar persistes estado entre las peticionesMSC4 La línea de detección se ejecuta dentro del único llamamiento gRPC y su resultado se propaga como nueve encabezados HTTPSSK5
Mostlylucid.BotDetection.Sidecar es un proceso mínimo ASP.NET Core M SK1 No tiene UI, no tiene servicio de archivo estático , y no tiene rutas más allá de los puntos finales gRPC y RESTMSC4 Empieza el motor de detección completo y expone dos puertosMNK5
/api/v1/* El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. es un marco de llamadas de procedimiento remoto de alto rendimiento - desarrollado en Google El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. : un código binario compacto que es más rápido para serializar y menor en el cable que JSONM SK3 gRPC ejecuta sobre HTTP/2, lo que significa que recibe multiplexing (multiple requests over one TCP connectionMST6 for freeMSC7
La interfaz está definida en un .proto file. Los generadores de código de ese archivo, producen ficheros de cliente y servidor tipificados en cualquier idioma de soporteM SK2 StyloBot publica .proto archivos para que cualquier lengua con una implementación gRPC pueda llamar el sidecar
El Servicio cuenta con tres PCR:
service DetectionService {
rpc Detect(DetectRequest) returns (DetectResponse);
rpc DetectBatch(DetectBatchRequest) returns (DetectBatchResponse);
rpc RenderWidget(RenderWidgetRequest) returns (RenderWidgetResponse);
}
Detect es el per-la ruta caliente de la petición. Método de pasarlaM SK2 la ruta , los encabezamientosMNK4 IP remotoMMK5 y datos de huellas digitales opcionales TLSMRK6 Opera el canal de onda MZK7 solo los detectores que la solicitudMKK8 sus señales garantizanMGK9 actualiza el vector de sesiónMDK10 las notas contra el almacén de reputaciónM GK11 y devolve un veredictoMTK12
DetectBatch Run multiple requests sequentially. Used for log replay and offline analysis
RenderWidget acepta una cadena de plantilla líquida, un veredicto opcionalM SK1 y una clave- mapa de valor de las variables adicionales , luego reproduce el servidor de plantillaMSC4 lado y devolve HTMLMNK5 Así se producen los bots no NETMST6MSP7 que conocen HTML sin crear un proceso de reproducción separadoMSV8 detalles en la sección RenderWidget de abajoMSR9
Un glossario rápido antes del diagrama, ya que estos nombres aparecerán:
request.ip.is_datacenter, detection.useragent.confidence). Los detectores le escriben señales; los detectores posteriores en la misma onda los leeM SK2 vive sólo durante la duración de una peticiónMSC3 Raw PII (IPMNK5 String UAMRK6 permanece en el contexto de la solicitud y nunca aterriza en la tabla de telas.HttpContext el servicio gRPC se construye a partir de los campos de demanda protórica. El motor de detección fue diseñado para ASP.NET middleware y espera leer desde HttpContext; sintetizar uno permite que el mismo motor funcione inalterado dentro de un llamamiento gRPCsequenceDiagram
participant GW as Gateway (Caddy)
participant SD as gRPC Service
participant ORC as BlackboardOrchestrator
participant DET as Detectors (up to 49, 4 waves)
participant DB as SQLite
GW->>SD: Detect RPC { method, path, headers, remoteIp }
SD->>ORC: DetectAsync(syntheticHttpContext)
ORC->>DET: Wave 0 - Identity + ContentSequence
ORC->>DET: Wave 1 - Fast path <1ms: UA, Header, IP, Heuristic ...
ORC->>DET: Wave 2 - Session vectors, Behavioural waveform
ORC->>DET: Wave 3 - Slow path: DNS, advanced fingerprinting
DET-->>ORC: DetectionContributions (signals, confidence deltas)
ORC->>DB: update session vector and reputation score
DB-->>ORC: ok
ORC-->>SD: AggregatedEvidence { botProbability, riskBand, ... }
SD-->>GW: DetectResponse { isBot, riskBand, recommendedAction, ... }
La totalidad del pipeline se ejecuta dentro de la llamada única gRPC. No hay trabajo asinc después de que la respuesta regrese.
El código de entrada en Go no puede importar el ASP.NET sidecarM SK1 Lo que puede hacer es llamarlo a través del gRPC. El SDK Go (github.com/scottgal/stylobot-go) proporciona una interfaz tipificadora que oculta completamente los tipos de protobuf generados de los llamadas.
Protobuf-el código generado es verboso y tiene una API inusual. Las enmiendas son representadas como integersM SK2 Las cadenas vienen como nombres de enum proto cruo (RISK_BAND_HIGHEl Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. "High"). Los nombres de campos son camelCase en algunos generadores y espada_case en otrosM SK2 Exposición de los tipos de proto en su API público significa que sus llamadas tienen que entender todo esto
El SDK traduce una vez en la frontera (enums de proto a cadenas canónicasM SK1structos de proto al simple Structures de Go ) y los llamadores nunca lo ven.
// the only interface you depend on: no proto imports required
type Client interface {
Detect(ctx context.Context, req DetectRequest) (*Verdict, error)
DetectBatch(ctx context.Context, reqs []DetectRequest) ([]*Verdict, error)
RenderWidget(ctx context.Context, req RenderRequest) (*RenderResponse, error)
Close() error
}
DetectRequest El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. Verdict son estructuras simples de Go:
type DetectRequest struct {
Method string
Path string
Headers map[string]string
RemoteIP string
Protocol string // "http" or "https"; defaults to "https" if empty
TLS *TLSInfo
}
type Verdict struct {
IsBot bool
BotProbability float32
Confidence float32
BotType string // "AiBot", "Scraper", "GoodBot", ...
BotName string
RiskBand string // "VeryLow", "Low", "Elevated", "Medium", "High", "VeryHigh"
RecommendedAction string // "Allow", "Throttle", "Challenge", "Block"
ThreatScore float32
ThreatBand string
ProcessingTimeMs float32
DetectorsRun int32
Reasons []Reason
}
Crear un cliente y ejecutar la detección:
import (
stylobot "github.com/scottgal/stylobot-go"
"context"
"time"
)
client, err := stylobot.NewClient(
"localhost:5090",
stylobot.WithTimeout(50 * time.Millisecond),
stylobot.WithAPIKey(os.Getenv("SB_API_KEY")),
)
if err != nil {
log.Fatal(err)
}
defer client.Close()
verdict, err := client.Detect(ctx, stylobot.DetectRequest{
Method: r.Method,
Path: r.URL.RequestURI(),
RemoteIP: r.RemoteAddr,
Headers: extractHeaders(r),
Protocol: "https",
})
if err != nil {
// fail open: log and continue
log.Printf("stylobot detect failed: %v", err)
return next(w, r)
}
if verdict.RecommendedAction == "Block" {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
grpc.NewClient crea un canal cliente pero no establece una conexión TCP inmediatamente. La conexión se produce en la primera llamada RPC. Esto significa que su proceso de puerta de entrada comienza con éxito incluso si el coche lateral todavía no ha empezadoM SK2 La primera petición después del inicio puede fracasar MSC3y debería ser tratada con fracasoMST4openMst5 pero cada petición posterior funciona normalmente una vez que el coche secundario esté en marchaM st6
Esto es distinto de los clientes HTTP, donde normalmente se conecta en la creación gRPC Documentación para ir El equipo de propiedad de los contingentes de las Naciones Unidas en el Líbano (UNMIL) y la Misión de Administración Provisional de las Forces nouvelles (UNMIK) se encargan de prestar apoyo logístico a las operaciones de mantenimiento de la paz.
WithTimeout El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. NewClient fija un plazo de llamada por - por defecto aplicado dentro de cada Detect call. Si su código de llamada M SK1o medioware como el plugin Caddy) deja de derivar un plazo - contexto limitado de la solicitud encomiableMSC4 el SDK aplica cualquiera que sea el plazo que expire primeroMNK5 Cuando el plugin caddy está en usoMRK6 el plugin posee el plazo |50ms | ; usted puede omitirlo WithTimeout El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. NewClient y dejar que el plugin lo controle. Para usar standalone (un handler llamando directamente al SDKM SK2 ponerlo en NewClient El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. es un servidor web basado en Go- y proxy inversa con HTTPS automatizado. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. para construir un binario Caddy personalizado que incluya sus plugins, produciendo un único auto-contenido binario sin dependencia de tiempo de ejecución en las bibliotecas compartidasM SK2 Esto es diferente del sistema de módulos dinámicos nginx '.so archivos cargados en tiempo de ejecución). Plugin StyloBot (github.com/scottgal/caddy-stylobot) registra un handler de middleware que llama el Go SDK en cada solicitud.
La configuración de Caddyfile:
{
order stylobot before respond
}
:80 {
stylobot {
endpoint localhost:5090 # gRPC host:port of the sidecar
timeout 50ms # per-request deadline; fails open on expiry
# on_block 503 # optional: change the block status code (default: 403)
}
reverse_proxy upstream:3000
}
El plugin injecta nueve encabezamientos de sentencia en cada solicitud enviada:
El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.
|---|---|
| X-StyloBot-IsBot | isBot El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
| X-StyloBot-Probability | botProbability (0.0-1.0) |
| X-StyloBot-Confidence | confidence (0.0-1.0) |
| X-StyloBot-BotType El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. AiBot, Scraper, GoodBot |
| X-StyloBot-BotName El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. GPTBot, Googlebot |
| X-StyloBot-RiskBand | VeryLow ... VeryHigh |
| X-StyloBot-Action | Allow / Throttle / Challenge / Block |
| X-StyloBot-ThreatScore El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
| X-StyloBot-ThreatBand | None ... Critical |
El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. isBot=true El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. Action=Block se paran en la puerta con un 403 y nunca llegar al upstream. Todo el resto (incluyendo los bots con un Throttle El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. Challenge ii) En el párrafo 2 de la parte dispositiva del proyecto de resolución A/C.3/60/L.32, la Asamblea General pidió al Secretario General que le presentara un informe sobre los progresos realizados en la aplicación de las recomendaciones contenidas en su resolución 60/251;
on_block cambia el código de estado usado cuando la puerta bloquea (defaultM SK1 403). Seta on_block 503 para suprimir la lógica de retry en los scrapers que tratan 403 como retryable.
flowchart TD
classDef input fill:none,stroke:#3b82f6,stroke-width:2px
classDef async fill:none,stroke:#a855f7,stroke-width:2px
classDef good fill:none,stroke:#22c55e,stroke-width:2px
A["1. Strip inbound X-StyloBot-* headers"]:::input
B["2. context.WithTimeout(r.Context(), 50ms)"]:::input
C["3. sbClient.Detect(ctx, DetectRequest)"]:::async
D{error?}
E["log warn - fail open<br/>forward unchanged"]:::good
F["4. injectHeaders<br/>X-StyloBot-IsBot, Probability, Confidence,<br/>BotType, BotName, RiskBand, Action,<br/>ThreatScore, ThreatBand"]:::input
I["next.ServeHTTP - forward to upstream<br/>with all verdict headers injected"]:::good
A --> B --> C --> D
D -->|yes| E --> I
D -->|no| F --> I
El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. X-StyloBot-* los nombres de los encabezamientos podría auto-injetar un fallo favorable y tener que sobrevivir el fracaso-pace abiertoM SK2El retiro de ellos primero significa que el fallo que se ve en el upstream siempre vino de la autopista sidecar .
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. r.Context() El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. context.WithTimeout El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. context.WithDeadline El Grupo de Trabajo tal vez desee tomar nota de que el párrafo 1 del artículo 2 de la Convención sobre los Derechos del Niño relativo a la venta de niños, la prostitución infantil y la utilización de niños en la pornografía dispone que: r.Context() El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. context.Background() es el punto clave: si el cliente desconecta antes de que termine la llamada gRPC, la cancelación se propaga y la autopista interrumpe el procesamiento antesM SK2
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. X-StyloBot-* headers. Los encabezamientos se configuran antes del control de bloqueo, para que el upstream los lea a través styloBotMiddleware({ mode: 'headers' }) Para todas las solicitudes no bloqueadas-Requests where isBot=true El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. recommendedAction=Block Se le devolverá como 403 en la puerta de entrada; todo lo demás se avanza con los encabezamientos completos del veredicto adjuntosM SK2
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
// from sdk/caddy/stylobot.go
func (s *StyloBot) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error {
for _, name := range stylobotHeaders {
r.Header.Del(name)
}
ctx, cancel := context.WithTimeout(r.Context(), s.timeout)
defer cancel()
verdict, err := s.sbClient.Detect(ctx, sb.DetectRequest{
Method: r.Method,
Path: r.URL.RequestURI(),
RemoteIP: ExtractIP(r),
Protocol: r.Proto,
Headers: ExtractHeaders(r),
})
if err != nil {
s.logger.Warn("stylobot detect failed, failing open", zap.Error(err))
return next.ServeHTTP(w, r)
}
injectHeaders(r, verdict)
if verdict.IsBot && s.OnBlock > 0 && verdict.RecommendedAction == "Block" {
http.Error(w, "Forbidden", s.OnBlock)
return nil
}
return next.ServeHTTP(w, r)
}
Las plugins Caddy deben ser compilados en el binario usando El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.. El Dockerfile en las pruebas de integración muestra el patrón:
# from tests/integration/caddy-sidecar/Dockerfile
FROM caddy:2-builder AS builder
WORKDIR /build
COPY sdk/caddy/ caddy-plugin/
COPY sdk/go/ go/
WORKDIR /build/caddy-plugin
RUN xcaddy build \
--with github.com/scottgal/caddy-stylobot=/build/caddy-plugin \
--with github.com/scottgal/stylobot-go=/build/go
FROM caddy:2
COPY --from=builder /build/caddy-plugin/caddy /usr/bin/caddy
COPY tests/integration/caddy-sidecar/Caddyfile /etc/caddy/Caddyfile
El plugin's go.mod El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
replace github.com/scottgal/stylobot-go => ../go
Esto indica a la cadena de herramientas Go " cuando usted ve stylobot-go, usar el directorio local en lugar de extraer del proxy del módulo." Funciona para go build El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. go test en el directorio de plugins.
xcaddy crea un nuevo módulo temporal de Go para su construcción. Este módulo no inherirá. replace directrices del plugin's go.modEl Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. --with argument, xcaddy intentaría descargar stylobot-go El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. pkg.go.dev El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. --with module=path Argumento es el equivalente nativo de xcaddy's a un replace directive: mapiza el camino de un módulo a un directorio local en el momento de construirM SK1 Ambos módulos locales deben tener un nombre explícito.
RenderWidget es un gRPC RPC en la autopista que acepta una cadena de plantilla líquida, la reproduce con el contexto de detecciónM SK1 y devolve HTML. Esto permite a cualquier llamadar (Ga proxyMSC4 Layer SSR del nodoMNK5 Línea de paquetes de pachadasMST6 producir botM ST7aware HTML sin ejecutar un proceso de reproducción separadoM st8
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. es un lenguaje de templación creado por Shopify, usado por los temas Shopified, JekyllM SK2 Pages GitHub , y muchos otros sistemasMSC4 Sus propiedades claveMST5 seguro para ejecutar con el usuarioMSSK6 plantillas suministradas MSP7no ejecución arbitraria de códigoMSV8 sencillo suficiente para que los desarrolladores que no sonMSR9 no escribanMSL10 y bien entendidosMSS11 StyloBot utiliza El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer., una alta -performencia .implementación NET de Liquid, para render servidores de plantillas
El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General sobre la aplicación de las recomendaciones contenidas en el párrafo 6 supra.
// from src/Mostlylucid.BotDetection.Sidecar/Services/DetectionGrpcService.cs
private static readonly FluidParser Parser = new(); // static, shared, compiled templates cached
public override async Task<Proto.RenderWidgetResponse> RenderWidget(
Proto.RenderWidgetRequest request, ServerCallContext context)
{
if (!Parser.TryParse(request.Template, out var template, out var error))
return new Proto.RenderWidgetResponse { Success = false, Error = error };
var ctx = new TemplateContext();
if (request.Verdict is { } v)
{
ctx.SetValue("isBot", v.IsBot);
ctx.SetValue("botProbability", (double)v.BotProbability);
ctx.SetValue("botType", v.BotType);
ctx.SetValue("botName", v.BotName);
ctx.SetValue("riskBand", v.RiskBand.ToString());
ctx.SetValue("recommendedAction", v.RecommendedAction.ToString());
ctx.SetValue("threatScore", (double)v.ThreatScore);
ctx.SetValue("threatBand", v.ThreatBand.ToString());
}
foreach (var kv in request.Vars)
ctx.SetValue(kv.Key, kv.Value);
var html = await template.RenderAsync(ctx);
return new Proto.RenderWidgetResponse { Html = html, Success = true };
}
Fluid.Core mantiene un archivo de plantilla compilado internoM SK1 Rendimientos repetidos de la misma cadena de plantilla saltar re-parsingMSC3 El FluidParser es estático y compartido en todos los llamamientos gRPC.
El Consejo de Seguridad reanudó el examen del tema sin proceder a votación. StyloBotGrpcClient.renderWidget() ejemplo y la referencia completa de la variable template están en el Artículo de TypeScript SDK.
Se llama desde Go:
rendered, err := client.RenderWidget(ctx, stylobot.RenderRequest{
Template: `{% if isBot %}<p class="warning">Bot: {{ botType }}</p>{% endif %}`,
Verdict: verdict,
Vars: map[string]string{"locale": "en-GB"},
})
if err == nil && rendered.Success {
fmt.Fprint(w, rendered.HTML)
}
La sintaxis de la plantilla es idéntica si llamas RenderWidget De Go, Node, o usar <sb-widget> en el navegador: la misma máquina líquida, los mismos nombres de variablesM SK2 el mismo camino de rendering .
graph LR
classDef input fill:none,stroke:#3b82f6,stroke-width:2px
classDef async fill:none,stroke:#a855f7,stroke-width:2px
classDef good fill:none,stroke:#22c55e,stroke-width:2px
classDef store fill:none,stroke:#f59e0b,stroke-width:2px
INT([Internet])
CF["Cloudflare<br/>Tunnel / CDN"]
CA["Caddy<br/>+ caddy-stylobot"]:::input
SD["StyloBot Sidecar<br/>:5090 gRPC · :5091 REST"]:::async
WEB["Upstream App<br/>Node / Go / ASP.NET"]:::good
DB[("SQLite<br/>sessions · reputation")]:::store
INT --> CF --> CA
CA -->|"gRPC Detect<br/>≤50ms"| SD
SD <-->|"persist"| DB
CA -->|"X-StyloBot-* headers"| WEB
WEB -->|"/_stylobot/partials/render<br/>(widget rendering)"| SD
La aplicación ascendente llama directamente al sidecar para la rendering de widgets, pasar por la puerta de entrada. La rendering del widget necesita el contexto de verdicto completo y ocurre después de que la solicitud haya pasado ya la detección de la entrada , por lo que no hay duplicación de deteción de detectionM SK3
Caddy plugin, Node middleware, y Go SDK todos fallan abiertosM SK2 un tiempo de salida o error de la autopista lateral se convierte en un registro de advertencia y una sentencia vacía permisiva , no es MST4xxMSC5 El plazo SST6ms Caddy es una fecha fría MST7marja de seguridad de inicio Mst8 el coste steadyMst9estado en una conexión cálida es \MST10msM st11
El comercio-off esto codifica: bloqueando el tráfico legítimo porque la detección no está disponible es peor que la falta de tráfico de robots durante un fallo del coche secundario .
La serie de lanzamiento continúa. Más puestos sobre los interiores de detección, patronos de despliegueM SK2 observabilidad , y la topología comercial todavía están por venir
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. Como se indica en el párrafo 1 del artículo 5 de la Convención sobre los Derechos del Niño, el Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre hombres y mujeres.El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas y de otra índole..
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.