我正在尝试使用curl注销网站。当点击退出按钮时,这个网站会发回一个页面,询问我们是否要注销两个按钮“ok”和“cancel”。我用curl来获取这些数据
$headers = array(
"GET $geturl HTTP/1.1",
"Host: " . "$ip",
"User-Agent:Mozilla/5.0(X11;Linuxx86_64;rv:45.0)Gecko/20100101Firefox/45.0",
"Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*,q=0.8",
"Referer: " . $referer,
"Cookie: JSESSIONID=" . $session_id,
"Connection: keep-alive",
"Content-Length: 64",
'"etag": W/"102-1257495352000"',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 15); //timeout after 15 seconds
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLINFO_REDIRECT_URL, true);
curl_setopt($ch, CURLOPT_POSTREDIR, 3);
curl_setopt($ch, CURLOPT_COOKIESESSION, $session_id);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "logout=logout");
$result1 = curl_exec($ch1);
输出包含两种形式:
<form name="myLogout" action="logout.jsp" target="main" method="post">
<input name="logout" type="hidden" value="logout">
<input class="yesno" class="button" type="Submit" value=" OK ">
</form>
</td>
<td width="20"></td>
<td>
<form action="start.jsp" target="main">
<input class="yesno" type="Submit" value=" Cancel ">
</form>
然后会话等待大约15秒钟,以便将事件后的响应转到“确定”按钮。 因此,我发送另一个使用与上面相同的curl选项的发布请求,除了我将CURLOPT_CUSTOMREQUEST从“GET”更改为“POST”,但我得到null或“Bad Request”。 有人可以帮忙解决这个问题。
答案 0 :(得分:2)
我将尽我所能解释这一点。
提交该表单或任何表单所需要做的就是模仿它正在做的事情。
好的,表格有什么作用? 简单地说,他们使用GET或POST两种方法之一向服务器发送请求。 GET与在浏览器中使用URL相同(这就是为什么当您提交它时,查询参数会在URL中发生变化并获得新页面。)
因此,从理论上讲,您只需POST
logout.jsp
对logout=logout
表单操作的请求,其中包含<form name="myLogout" action="logout.jsp" target="main" method="post">
<input name="logout" type="hidden" value="logout">
<input class="yesno" class="button" type="Submit" value=" OK ">
</form>
形式的数据。
根据您是否构建该表单来考虑
action="logout.jsp"
如果我构建了这个表单,我会在$_POST
构建一个页面,我会使用<?php
if(isset($_POST['logout'])){
session_destroy();
header('Location: www.example.com');
exti();
}else{
//some error message or redirect to 404, this should never happen.
//maybe send message to the Internet police with your IP, just kidding
}
数组等(假设它是PHP)
curl_setopt($ch, CURLOPT_COOKIESESSION, $session_id);
curl_setopt($ch, CURLOPT_URL, '{www.example.com}/logout.jsp');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'logout=logout');
所以我只想查找post数组中的注销,然后销毁会话,然后重定向到我的主页。
所以在卷曲中你只需要
f12
然后是其他标准的CURL内容。
要考虑的一些事项: 现在这可能有效,也可能不行,有很多变量,我只是不知道能够说100%。他们可以使用cookie和JavaScript做一些事情,这超出了你只能用CURL做的事情(例如PhantomJS或无头浏览器处理程序)。但是,这个HTML非常简单(例如,没有随机生成的ID),所以我认为它不是那么先进。
要做的一件事是在浏览器中,登录后转到该页面。按.Net
打开浏览器调试窗口。找到网络面板,找到记录按钮(或保留)。注销,然后检查对该表单的服务器发出的请求。这就是你需要复制的东西。
总而言之,我多年来做了很多废话。现在我们有一个 //Where email input is being grabbed
$sanemail=mysqli_real_escape_string($con, $_POST['email']);
//User_id is being grabbed
$sql8="SELECT user_id FROM users WHERE email='".$sanemail."'";
$result=mysqli_query($con,$sql8);
$rows=mysqli_fetch_assoc($result);
$user_id=(int)$rows;
var_dump($rows);
var_dump($user_id);
人来处理它。它更适合我们所需的PHP。