如何在单个cURL请求中获取和发布信息?

时间:2019-06-12 11:22:41

标签: php json parsing curl dom

是否可以在同一value请求中获取input的{​​{1}}以及post信息?

原因: 我正在尝试使用cURL登录here,但是登录表单在名为cURL的{​​{1}}的{​​{1}}中生成了唯一的密钥。因此,我想首先获取该值,然后发布用户名和密码以成功登录。

PHP(无法正常工作,在空白页中没有源代码):

value

P.S。 当我手动登录并检查浏览器控制台->网络->发布->标头/参数时,我得到以下信息:-

input

更新。 两个单独的cURL请求(现在仍然有效):

include('simple_html_dom.php');

form_key

2 个答案:

答案 0 :(得分:2)

所以这是个介绍。

form_key似乎是CSRF保护的一种形式,特别是synchronizer token

简而言之,发生的情况是,用户访问网页,该网页为该用户创建会话并生成唯一令牌。然后,服务器将该唯一令牌作为隐藏字段附加到表单。当用户提交该表单时,它将与该隐藏字段一起提交,并且服务器可以交叉引用接收到的令牌与发送的令牌相同。

但是,关键的部分是服务器需要知道用户是谁,而这是通过会话完成的。通过会话cookie维护会话,因此需要会话cookie。

要正确模拟真实用户,您需要存储服务器在第一次访问时向您发送的cookie,这可以使用CURLOPT_COOKIEJAR来完成:

$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://b2b.chiemsee.com/customer/account/login/");
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true); // to allow redirections
//curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, FALSE); // to avoid error
curl_setopt($ch2, CURLOPT_POST, true); // to send info
curl_setopt($ch2, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch2, CURLOPT_COOKIEJAR, 'cookie.txt'); // to save session cookie
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); // to get the html
$response2 = curl_exec($ch2);
curl_close($ch2);

完成此操作并通过抓取页面检索CSRF令牌后,您需要将其与相应的cookie一起提交:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://b2b.chiemsee.com/customer/account/loginPost/"); //Make sure you have the correct URL
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // to allow redirections
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // to avoid error
curl_setopt($ch, CURLOPT_POST, true); // to send info
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // to read cookie data
curl_setopt($ch2, CURLOPT_COOKIEJAR, 'cookie.txt'); // optional, this will update existing cookies and add new ones if needed.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // to get the html
$response = curl_exec($ch);
if (curl_error($ch)) {
    $error_msg = curl_error($ch);
    var_dump($error_msg);
    exit;
}
curl_close($ch);
echo $response;

这应该允许服务器首先加载为其创建CSRF令牌的正确会话,然后验证您要发送的令牌。

作为旁注:令牌的原因很简单。如果我制作的网页欺骗用户直接发布到另一个网页,则该令牌是我永远无法访问的数据,因为它仅与用户直接共享,因此第三者无法访问它。它可能会使像您这样的自动化系统难以实施,但对于用户安全性非常有效。

答案 1 :(得分:1)

您要的内容是不可能的。不是因为cURL或PHP的限制,而是因为因果关系。考虑正在执行的逻辑步骤集。为了发送登录请求,您必须首先知道form_key。为了知道form_key,您必须首先请求登录页面。

简单来说,您无法利用尚未拥有的信息。

  • 发出第一个HTTP请求以获取表单信息。 (特别是您需要的form_key值。)
  • 发出第二个HTTP请求以发送登录信息,包括您从第一个请求中获取的数据。

没有理由尝试一步一步。