是否可以在同一value
请求中获取input
的{{1}}以及post
信息?
原因:
我正在尝试使用cURL登录here,但是登录表单在名为cURL
的{{1}}的{{1}}中生成了唯一的密钥。因此,我想首先获取该值,然后发布用户名和密码以成功登录。
PHP(无法正常工作,在空白页中没有源代码):
value
P.S。 当我手动登录并检查浏览器控制台->网络->发布->标头/参数时,我得到以下信息:-
input
更新。 两个单独的cURL请求(现在仍然有效):
include('simple_html_dom.php');
form_key
答案 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
,您必须首先请求登录页面。
简单来说,您无法利用尚未拥有的信息。
form_key
值。)没有理由尝试一步一步。