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

时间:2015-01-28 14:02:01

标签: php

$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&的新手树液。在此先感谢。

1 个答案:

答案 0 :(得分:2)

提出抓取请求。

作为第一步,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请求-Response流程:

客户要求:

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

...