Vistas:

Problema:

Las solicitudes HTTP contra la plataforma DocuWare de un sistema Cloud devuelven el código de estado 403 - Prohibido con el mensaje de respuesta "Solicitud bloqueada por el firewall de DocuWare".

Ejemplo:

curl https://{{url}}/docuware/platform/Organizations -H "Autorización: Bearer {{AccessToken}}" -H "Accept: application/json\r\n"
403 - Request bloqueada por el firewall de DocuWare

Causa raíz:

Este comportamiento se produce cuando el cortafuegos de DocuWare rechaza solicitudes que contienen posibles ataques de división de solicitudes y puede deberse a que uno o varios encabezados de solicitud utilizan CRLF para enviar cadenas de varias líneas.

.NET/ApplicationsInsights: Lo más probable es que su instrumentación de estilo .NET / App Insights esté añadiendo una cabecera de rastreo distribuido heredada. Las pilas antiguas de .NET/App Insights propagan el equipaje en la cabecera no estándar Correlation-Context. Las claves/valores en esa cabecera están codificados en URL. %0D%0A es el valor codificado en URL para CRLF, que muchos WAFs/firewalls marcan como request-splitting y bloquearán.

La clave específica que probablemente esté viendo es traceStartInfo, que es un nombre de entrada de equipaje. (Es un concepto de diagnóstico del lado de Microsoft; verá el mismo nombre en las rutas de código de rastreo de .NET).

  • El propagador .NET heredado (y los SDKs de Application Insights más antiguos, que dependen de él) escribe el bagaje de la aplicación en la cabecera de petición Correlation-Context, por ejemplo Correlation-Context: name1=value1,name2=value2... con valores codificados en URL. Si un valor contiene CR/LF, se convierte en %0D%0A, que el cortafuegos de DocuWare trata como sospechoso.
  • El estándar actual del sector es W3C Trace Context + W3C Baggage, es decir, propagar el rastreo a través de traceparent/tracestate y enviar el baggage en un encabezado de baggage separado (no Correlation-Context). Las versiones .NET más recientes se movieron por defecto en esa dirección.
  • A partir de .NET 10, el propagador por defecto es W3C (usa baggage, no Correlation-Context). Si todavía ve Correlation-Context, es probable que esté utilizando un tiempo de ejecución antiguo, una instrumentación antigua o que haya optado explícitamente por el propagador heredado.

Puede encontrar más información sobre la cabecera http Correlation-Context aquí: https://github.com/AloisReitbauer/distributed-tracing/blob/master/correlation_context/HTTP_HEADER_FORMAT.md

Solución general:

No permita cadenas de varias líneas en todas las cabeceras HTTP evitando todos los valores CRLF en las cabeceras HTTP.

Solución .NET A: Dejar de emitir Correlation-Context y cambiar a W3C

Actualice su tiempo de ejecución/instrumentación para que el valor predeterminado sea el propagador W3C, o configúrelo explícitamente al iniciar la aplicación. Esto hace que el equipaje fluya a través de la cabecera baggage y el rastreo a través de traceparent/tracestate, eliminando la cabecera Correlation-Context heredada .

Si estás instrumentado con OpenTelemetry o la distro OTel de Azure Monitor, mantén sólo los propagadores W3C (TraceContext + Baggage). Eso evita Correlation-Context por completo.

Para más información, ver aquí.

Solución B de .NET: Mantenga la implementación heredada, pero limpie lo que ponga en el equipaje

Si debe mantener Correlation-Context por compatibilidad, asegúrese de no añadir nunca CR o LF a los valores del equipaje. Busque en su código algo como Activity.Current?.AddBaggage("traceStartInfo", ...). Elimine \r/\n y evite las cadenas de varias líneas.

Solución .NET C: Elimine las cadenas de varias líneas de los valores de cabecera

Asegúrese de limpiar todas las cabeceras para eliminar CR\LF de cualquier valor de las cabeceras HTTP.

Solución JS de Application Insights:

Si el encabezado se origina en el navegador a través del SDK de Application Insights JS, puede desactivar temporalmente los encabezados de correlación o el ámbito en el que se añaden. El SDK decide si puede añadir cabeceras de correlación. Controlando estos ajustes se evita la emisión de cabeceras problemáticas a determinados orígenes.

new ApplicationInsights({

config: {

// ..

disableCorrelationHeaders: true

}

});