【问题标题】:Using PHP cURL to get CSRF-Token from URL and post it to another URL within the same session使用 PHP cURL 从 URL 获取 CSRF-Token 并将其发布到同一会话中的另一个 URL
【发布时间】:2016-12-30 15:33:40
【问题描述】:

我正在尝试根据从 supermariomakerbookmark.nintendo.net 网站收集的信息创建一个队列系统。首先,我在 URL https://supermariomakerbookmark.nintendo.net/courses/7E00-0000-0220-574B 中发出 GET 请求,以查找字段中存在的 CSRF-Token:

<meta name="csrf-token" content="xxxxxx">

之后,我需要向https://supermariomakerbookmark.nintendo.net/courses/7E00-0000-0220-574B/play_at_later 发出 POST 请求,并在 Header 中传递 CSRF-Token 和 Cookie。 cookie 由用户提供,并从数据库中检索。

这是我的代码:

$cookie = DB::table('CONFIG')->select('cookies')->first()->cookies;

// get csrf token
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://supermariomakerbookmark.nintendo.net/courses/$id");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$html = curl_exec($ch);

$dom = new \DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);

$metas = $dom->getElementsByTagName('meta');

for ($i = 0; $i < $metas->length; $i++){
  $meta = $metas->item($i);
  if($meta->getAttribute('name') == 'csrf-token')
    $csrfToken = $meta->getAttribute('content');
}

$headers = array();
$headers[] = "X-CSRF-Token: $csrfToken";
$headers[] = "Cookie: $cookie";

curl_setopt($ch, CURLOPT_URL, "https://supermariomakerbookmark.nintendo.net/courses/$id/play_at_later");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$ret = curl_exec($ch);

但它不起作用,curl POST 请求返回自定义 500 错误页面,而不是 200 OK。我在 Laravel 的控制器中执行这段代码。

如果我尝试使用 Postman 发出 POST 请求,它可以工作。关于如何使其工作的 Ant ideia?

【问题讨论】:

  • 是 curl 请求返回 500 还是这个 PHP 文件本身返回 500?
  • 忘了说,抱歉。我收到一个自定义的 500 错误页面作为 curl POST 请求的响应,而不是预期的 200 OK 状态。
  • 可能不相关,但您的 $cookie 标头真的应该具有相同的 'X-CSRF-Token' 密钥吗?
  • 这是一个错字,我将其删除以进行一些测试,当我将其放回原处时,只需从另一个标题中复制/粘贴即可。我已经用正确的键更新了代码。但它仍然不起作用:/

标签: php laravel curl csrf-protection


【解决方案1】:

我在使用另一个 Web 服务时遇到了类似的问题。在我的情况下,问题是标题的名称。

尝试更改此代码并进行测试:

$headers = array();
$headers[] = "Cookie: X-CSRF-Token=$csrfToken";
$headers[] = "Cookie: X-CSRF-Token=$cookie";

【讨论】:

  • 没有工作:/ 只是一个更新,我注意到如果拦截器被激活,我只能在邮递员中工作......不知道我还能尝试什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2016-12-23
  • 1970-01-01
  • 2014-04-06
  • 2015-02-13
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多