【发布时间】: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