对于PHP fsockopen伪造POST与GET方法的攻略,我可以提供以下完整的讲解和示例:
1. 简介
在进行HTTP请求时,我们通常会使用curl或者其他网络访问库。但是,使用fsockopen库来进行HTTP请求是一种不错的选择。 fsockopen是PHP提供的一种socket连接函数,可以用来进行各种类型的网络连接。
2. HTTP请求的基本流程
一个HTTP请求基本包含以下5个步骤:
- 建立TCP连接
- 发送HTTP请求
- 接收服务器响应
- 处理响应结果
- 关闭连接
3. 使用fsockopen进行HTTP请求
使用fsockopen进行HTTP请求,可以分为以下几个步骤:
- 建立TCP连接
- 设置请求头
- 发送HTTP请求
- 接收服务器响应
- 处理响应结果
- 关闭连接
3.1 建立TCP连接
建立TCP连接是一个固定的过程,一般来说,使用fsockopen函数建立HTTP连接的代码如下:
$fp = fsockopen($domain, $port, $errno, $errstr, $timeout);
参数说明:
- $domain:目标主机地址
- $port:目标主机端口
- $errno:错误码
- $errstr:错误信息
- $timeout:连接超时时间
建立TCP连接后,可以向服务器端发送请求信息。
3.2 设置请求头
请求头包含了HTTP请求的一些特定信息,fsockopen发送HTTP请求时使用的是字节流,所以需要手动构造请求头。一般情况下,请求头包含以下内容:
- 请求方法(GET/POST)
- 请求路径(/index.html)
- HTTP协议版本(HTTP/1.1)
- 主机地址(Host)
- 用户代理(User-Agent)
- 接受数据类型(Accept)
- 数据长度(Content-Length)
- 数据类型(Content-Type)
- Cookie
- 等...
以下是一个构造请求头的示例代码:
$post_data = "name=张三&age=20"; //POST数据
$req_header =
"POST /test.php HTTP/1.1\r\n".
"Host: www.example.com\r\n".
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0\r\n".
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
"Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\r\n".
"Referer: http://www.example.com\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Content-Length: ".strlen($post_data)."\r\n".
"Connection: close\r\n".
"Cookie: PHPSESSID=1234567890abcdef1234567890abcdef\r\n\r\n".
$post_data;
注意事项:
- 字符串形式的POST数据需要手动计算长度并填写到请求头中
- 请求头以空行结束,两个\r\n表示空行
3.3 发送HTTP请求
请求头构造完毕后,可以把请求信息发送给服务器。
fwrite($fp, $req_header);
3.4 接收服务器响应
服务器响应包含响应头和响应体两部分。使用fsockopen发送HTTP请求时,需要手动读取响应头和响应体。
响应头:
$res_header = '';
while(!feof($fp)) {
$line = fgets($fp, 2048);
if ($line == "\r\n") {
break; //空行表示响应头结束
}
$res_header .= $line;
}
响应体:
$res_body = '';
while (!feof($fp)) {
$res_body .= fgets($fp, 1024);
}
3.5 处理响应结果
得到响应头和响应体之后,就可以解析并处理响应结果了。
以下是一个简单的响应解析示例:
if (preg_match("/^HTTP\/\d\.\d\s+(\d+)\s+/i", $res_header, $match)) {
$http_status = $match[1]; //HTTP status code
}
$res = array(
'header' => $res_header,
'body' => $res_body,
'http_status' => $http_status
);
print_r($res);
3.6 关闭连接
处理完响应结果后,需要关闭连接。
fclose($fp);
4. 示例代码
以下是一个使用fsockopen伪造GET方法的示例:
/**
* 伪造GET方法请求
*
* @param string $url 请求URL
*/
function curl_get($url) {
$parse_url = parse_url($url);
$domain = $parse_url['host'];
$port = isset($parse_url['port']) ? $parse_url['port'] : 80;
$path = isset($parse_url['path']) ? $parse_url['path'] : '/';
$query = isset($parse_url['query']) ? $parse_url['query'] : '';
$fp = fsockopen($domain, $port, $errno, $errstr, 10);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
return;
}
$req = "GET $path?$query HTTP/1.1\r\n";
$req .= "Host: $domain\r\n";
$req .= "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0\r\n";
$req .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$req .= "Accept-Encoding: gzip, deflate\r\n";
$req .= "Connection: close\r\n\r\n";
fwrite($fp, $req);
$content = '';
while (!feof($fp)) {
$content .= fgets($fp, 1024);
}
fclose($fp);
return $content;
}
$result = curl_get("http://www.example.com/test.php?name=张三&age=20");
echo $result;
以下是一个使用fsockopen伪造POST方法的示例:
/**
* 伪造POST方法请求
*
* @param string $url 请求URL
*/
function curl_post($url) {
$parse_url = parse_url($url);
$domain = $parse_url['host'];
$port = isset($parse_url['port']) ? $parse_url['port'] : 80;
$path = isset($parse_url['path']) ? $parse_url['path'] : '/';
$post_data = "name=张三&age=20"; // POST数据
$req = "POST $path HTTP/1.1\r\n";
$req .= "Host: $domain\r\n";
$req .= "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0\r\n";
$req .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$req .= "Accept-Encoding: gzip, deflate\r\n";
$req .= "Content-Type: application/x-www-form-urlencoded\r\n";
$req .= "Content-Length: ".strlen($post_data)."\r\n";
$req .= "Connection: close\r\n\r\n";
$req .= $post_data;
$fp = fsockopen($domain, $port, $errno, $errstr, 10);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
return;
}
fwrite($fp, $req);
$content = '';
while (!feof($fp)) {
$content .= fgets($fp, 1024);
}
fclose($fp);
return $content;
}
$result = curl_post("http://www.example.com/test.php");
echo $result;
以上就是关于php fsockopen伪造POST与GET方法的详细攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php fsockopen伪造post与get方法的详解 - Python技术站