Problème :
Les requêtes HTTP adressées à la DocuWare Platform d'un système DocuWare Cloud renvoient le code d'état 403 - Forbidden avec le message de réponse " Request blocked by DocuWare firewall " (Requête bloquée par le pare-feu DocuWare).
Exemple :
curl https://{{url}}/docuware/platform/Organisations -H "Authorization : Bearer {{AccessToken}}" -H "Accept : application/json\r\n"
403 - La Request est bloquée par le pare-feu DocuWare.
Cause première :
Ce comportement se produit lorsque le pare-feu DocuWare rejette les requêtes contenant des attaques potentielles de fractionnement des requêtes et peut être causé par un ou plusieurs en-têtes de requête utilisant CRLF pour envoyer des chaînes de plusieurs lignes.
.NET/ApplicationsInsights : Il est très probable que votre instrumentation de type .NET / App Insights ajoute un en-tête de traçage distribué hérité. Les anciennes piles .NET/App Insights propagent des données dans l' en-tête non standard Correlation-Context. Les clés/valeurs de cet en-tête sont codées en URL. %0D%0A est la valeur URL codée pour CRLF, que de nombreux WAFs/firewalls signalent comme un fractionnement de requête et bloquent.
La clé spécifique que vous voyez le plus probablement est traceStartInfo, qui est un nom d'entrée de bagage. (Il s'agit d'un concept de diagnostic propre à Microsoft ; vous verrez le même nom dans les chemins de code de traçage .NET).
- L'ancien propagateur .NET (et les anciens SDK Application Insights qui s'appuient sur lui) écrit le bagage de l'application dans l' en-tête de requête Correlation-Context, par exemple Correlation-Context : name1=value1,name2=value2... avec des valeurs encodées dans l'URL. Si une valeur contient des CR/LF, elle devient %0D%0A, ce que le pare-feu DocuWare considère comme suspect.
- La norme industrielle actuelle est W3C Trace Context + W3C Baggage, c'est-à-dire propager le traçage via traceparent/tracestate et envoyer le bagage dans un en-tête bagage séparé (pas Correlation-Context). Les nouvelles versions de .NET ont évolué par défaut dans cette direction.
- À partir de .NET 10, le propagateur par défaut est le W3C (il utilise le bagage et non Correlation-Context). Si vous voyez encore Correlation-Context, il est probable que vous utilisiez un ancien runtime, une ancienne instrumentation ou que vous ayez explicitement opté pour l'ancien propagateur.
Pour plus d'informations sur l'en-tête http Correlation-Context, voir : https://github.com/AloisReitbauer/distributed-tracing/blob/master/correlation_context/HTTP_HEADER_FORMAT.md
Solution générale :
Interdire les chaînes à plusieurs lignes dans tous les en-têtes HTTP en évitant toutes les valeurs CRLF dans les en-têtes HTTP.
Solution .NET A : Arrêtez d'émettre Correlation-Context et passez au W3C
Mettez à jour votre runtime/instrumentation pour que la valeur par défaut soit le propagateur W3C, ou définissez-le explicitement au démarrage de l'application. Cela permet de faire circuler le bagage via l' en-tête baggage et le traçage via traceparent/tracestate, en éliminant l'en-tête Correlation-Context hérité .
Si vous êtes instrumenté avec OpenTelemetry ou la distro OTel d'Azure Monitor, conservez uniquement les propagateurs W3C (TraceContext + Baggage). Cela permet d'éviter complètementCorrelation-Context.
Pour plus d'informations, voir ici.
Solution B pour .NET : Conserver l'implémentation existante, mais assainir ce que vous mettez dans Baggage
Si vous devez conserver Correlation-Context pour des raisons de compatibilité, assurez-vous de ne jamais ajouter CR ou LF aux valeurs de bagage. Recherchez dans votre code quelque chose comme Activity.Current ?.AddBaggage("traceStartInfo", ...). Supprimez les \r/\n et évitez les chaînes à plusieurs lignes.
.NET Solution C : Supprimer les chaînes de caractères multilignes des valeurs d'en-tête
Veillez à assainir tous les en-têtes afin de supprimer CR\LF de toutes les valeurs des en-têtes HTTP.
Solution Application Insights JS :
Si l'en-tête provient du navigateur via le SDK Application Insights JS, vous pouvez désactiver temporairement les en-têtes de corrélation ou la portée dans laquelle ils sont ajoutés. Le SDK décide s'il peut ajouter des en-têtes de corrélation. Le contrôle de ces paramètres permet d'éviter d'émettre des en-têtes problématiques vers certaines origines.
new ApplicationInsights({
config : {
// ..
disableCorrelationHeaders : true
}
}) ;
