CSRF 令牌验证失败:PHP POST - SAP


CSRF token validation failed : PHP POST - SAP

$post = null;
$host = parse_url($url, PHP_URL_HOST);
$headerArr = array();
$headerArr[] = 'Content-Type:application/xml';
$headerArr[] = 'Host:' .$host;
$headerArr[] = 'X-CSRF-Token:Fetch';
$headerArr[] = 'X-Requested-With:XMLHttpRequest';
$xml_data = file_get_contents ("upload.xml");
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");    
curl_setopt($ch, CURLOPT_SSLVERSION,3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArr);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$xml_data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
if(curl_errno($ch)){
    echo 'Curl error: ' . curl_error($ch);
}

上面我用来将我的xml数据发布到SAP的代码。但是我收到错误"CSRF 令牌验证失败",谁能帮我弄清楚同样的问题。如何获取 CSRF 令牌并使用相同的令牌。从我需要获得正确的 CSRF 令牌。我是PHP和SAP的新手。提前谢谢。

发出获取请求。

作为第一步,REST 客户端应获取当前会话的有效 CSRF 令牌。为此,它发出一个非修改请求,并包含一个自定义标头X-CSRF-Token: Fetch。返回的 [sessionid – csrf token] 对应缓存并由客户端在后续 REST 请求中使用。另一种选择是在每个 REST 请求之前发送 Fetch 请求,因此仅使用 [sessionid – csrf token] 对一次。HTTP 请求-响应流示例:

客户请求:

GET /restDemo/services/customers/list HTTP/1.1
X-CSRF-Token: Fetch
Authorization: Basic dG9tY2F0OnRvbWNhdA==
Host: localhost:8080

服务器响应:

HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=4BA3D75B73B8C4591F1D915BA9C2B660; Path=/restDemo/; HttpOnly
X-CSRF-Token: 5A44B387B75E54417F6C64FF3D485141
...

将缓存的 [sessionid – csrf token] 对用于后续 REST 请求。

随后修改对同一应用程序的 REST 请求应包括有效的 jsessionid cookie 和有效的 X-CSRF-Token 标头。示例 HTTP 请求-响应流:

客户请求:

POST /restDemo/services/customers/removeCustomer HTTP/1.1`
Cookie: JSESSIONID=4BA3D75B73B8C4591F1D915BA9C2B660
X-CSRF-Token: 5A44B387B75E54417F6C64FF3D485141
Authorization: Basic dG9tY2F0OnRvbWNhdA==
Host: localhost:8080

服务器响应:

HTTP/1.1 200 OK