Wert eines X-CSRF-Tokens aus HTTP-Response auslesen

14. März 2024 15:59

Anbei ein Codefragment mit zwei Regexpatterns, um den Wert eines X-CSRF-Tokens (Cross-Site-Request-Forgery) aus dem Header einer HTTP-Response z.B. einem solchen:
Code:
Connection: keep-alive
Date: Thu, 14 Mar 2024 13:52:00 GMT
Set-Cookie: xyz-usercontext=abc-client=100; path=/, XYZ_SESSIONID_DB1_100=sq3HjwW7xi7ylkfkkBooDweOpCvioseesdSObpwF_HHo%3d; path=/; HttpOnly
x-csrf-token: 4sW0WeVEFVT8UREuf7pzeQ==
XYZ-metadata-last-modified: Wed, 23 Aug 2023 09:41:11 GMT
cache-control: no-store, no-cache
dataserviceversion: 2.0
xyz-processing-info: ODataBEP=,crp=,RAL=,st=X,MedCacheHub=SHM,MedCacheBEP=SHM,codeployed=X,softstate=
xyz-server: true
xyz-perf-fesrec: 69100.000000

erhältlich z.B über
Code:
Response := Client.SendAsync(Request).Result;
ResponseHeaderText := Response.Headers.ToString();

nach einem GET mittels Regex.Match (.NET) bzw. Regex.IsMatch auszulesen, um dieses für ein nachfolgenden POST zur Verfügung zu haben.
Pattern1 findet x-csrf-token als Wort, und Pattern2 das aktuelle Token 4sW0WeVEFVT8UREuf7pzeQ==
Code:
     
RegexPattern1 := '\W*((?i)x-csrf-token:(?-i))\W*';
RegexPattern2 := '(?<=x-csrf-token:).*';
Regex := Regex.Regex(RegexPattern1);
if Regex.IsMatch(ResponseHeaderText, RegexPattern1) then
     CSRF := Regex.Match(ResponseHeaderText, RegexPattern2).value.ToString()
else
     CSRF := '';


Um das Token in der Response zu erhalten, dem Request dieses mitgeben:
Code:
Request.Headers.Add('x-csrf-token', 'fetch')

Für andere einzeilige Kombinationen einfach das x-csrf-token: in den Patterns austauschen :wink: z.B. gegen Set-Cookie.
Version: AL in BC 14 on-premises. Für SaaS oder Universal Code ohne .NET steht (ab BC 17) das interne Regex-Modul hierfür zur Verfügung (Codeunit 3960).