백엔드 개발 PHP 튜토리얼 自定义HTTP抓包跟过滤

自定义HTTP抓包跟过滤

Jun 13, 2016 pm 12:11 PM
function gt http nbsp this

自定义HTTP抓包和过滤
定义一个http抓包类,发送数据到一个自定义的接受脚本,可以发送成功,并收取数据,但是发送到外网,却不行,分析过在浏览器下发送HTTP请求时的request header 信息,通过模拟请求,但超时...

<br />//定义一个HTTP抓包类,其实也可以用curl。。。。。<br /><br /><?php <br />ini_set('error_reporting', E_ALL);<br />class Httpwrap<br />{<br />	private $hostInfo=null;<br />	<br />	private $requestLine=null;<br />	private $requestHeader=null;<br />	private $emptyLine="\r\n";<br />	private $requestBody=null;<br />	private $requestEntity=null;<br />	<br />	private $responseEntity=null;<br />	private $responseHeader=null;<br />	private $responseBody=null;<br />	private $emptyLinePos=null;<br />	<br />	private $connect=null;<br />	private $errNo=null;<br />	private $errStr=null;<br />	<br />	<br />	public function __construct($url)<br />	{<br />		$this->hostInfo=parse_url($url);<br />		$this->setRequestHeader(array('Host' => $this->hostInfo['host']));<br />		$this->setRequestHeader(array('Connection' => 'keep-alive'));<br />	}<br />	//设置HTTP请求行信息,例如: GET /resources  HTTP/1.1<br />	//但为了避免漏掉url中?开始的查询信息,有必要进行判断<br />	public function setRequestLine($method)<br />	{<br />		//如果是POST请求,则自动添加content-type头信息<br />		if(strtolower($method)=='post')<br />		{<br />			$this->setRequestHeader(array('Content-type' => 'application/x-www-form-urlencoded'));<br />		}<br />		if(!empty($this->hostInfo['query']))<br />		{<br />			$this->requestLine=strtoupper($method)."  ".$this->hostInfo['path']."?".$this->hostInfo['query']."  HTTP/1.1 \r\n";<br />		}<br />		else<br />		{<br />			$this->requestLine=strtoupper($method)."  ".$this->hostInfo['path']."  HTTP/1.1 \r\n";<br />		}<br />	}<br />	//设置HTTP请求头。<br />	//接收参数是数组类型,通过迭代拼接key:value,并换行<br />	public function setRequestHeader($header)<br />	{<br />		foreach($header as $key => $value)<br />		{<br />			$this->requestHeader .=$key.":".$value."\r\n";<br />		}<br />	}<br />	//设置HTTP请求体<br />	//接收参数是数组类型,通过迭代拼接key=value,因为最后一席拼接会有一个多余的&,所以有必要去掉<br />	public function setRequestBody($body)<br />	{<br />		foreach($body as $key => $value)<br />		{<br />			$this->requestBody .=$key.'='.$value.'&';<br />		}<br />		$offset=strrpos($this->requestBody, '&');<br />		$this->requestBody=substr($this->requestBody, 0, $offset);<br />	}<br />	//组装  请求行+请求头+请求体,并根据请求体的长度,自动填充请求头的content-length字段<br />	public function setRequestEntity()<br />	{<br />		if(!empty($this->requestBody))<br />		{<br />			$contentLength=strlen($this->requestBody);<br />			$this->setRequestHeader(array('Content-length' => $contentLength));<br />			<br />			$this->requestEntity=$this->requestLine.$this->requestHeader."\r\n".$this->requestBody;<br />		}<br />		else<br />		{<br />			$this->requestEntity=$this->requestLine.$this->requestHeader."\r\n";<br />		}<br />	}<br />	//解析主机名的函数,暂时没有用上.......<br />	public function parseHost($url)<br />	{<br />		$pat='#http://([^/]+)#i';<br />		if(preg_match($pat, $url, $match))<br />		{<br />			return $match[1];<br />		}<br />		else<br />		{<br />			echo '匹配主机信息失败<br />';<br />		}<br />	}<br />	//创建到主机的连接<br />	public function createConnect()<br />	{<br />		$this->connect=fsockopen($this->hostInfo['host'], 80, $this->errNo, $this->errStr) or die('连接主机失败'.$this->errStr);<br />	}<br />	//发送请求<br />	public function sendRequest()<br />	{<br />		$this->setRequestEntity();<br />		echo $this->requestEntity;<br />		exit();<br />		$this->createConnect();<br />		$entityLength=strlen($this->requestEntity);<br />		if($entityLength != fwrite($this->connect, $this->requestEntity, $entityLength))<br />		{<br />			die('写入数据失败<br />');<br />		}<br />		else<br />		{<br />			$this->receiveResponse();<br />		}<br />	}<br />	//接受请求,并依次拼接响应体<br />	public function receiveResponse()<br />	{<br />		while(!feof($this->connect))<br />		{<br />			$this->responseEntity .= fread($this->connect, 1024);<br />		}<br />	}<br />	//计算响应头与响应体之间的空行的位置<br />	public function calculateEmptyLinePos()<br />	{<br />		$this->emptyLinePos=strpos($this->responseEntity,"\r\n\r\n",0);<br />	}<br />	//接受响应体的头部....<br />	public function receiveResponseHeader()<br />	{<br />		$this->calculateEmptyLinePos();<br />		$this->responseHeader=substr($this->responseEntity, 0, $this->emptyLinePos);<br />		echo $this->responseHeader;<br />	}<br />	//接收响应体的body部分<br />	public function receiveResponseBody()<br />	{<br />		$this->calculateEmptyLinePos();<br />		$this->responseBody=substr($this->responseEntity, $this->emptyLinePos);<br />	}<br />	//返回请求结果<br />	public function getResponse()<br />	{<br />		return $this->responseEntity;<br />	}<br />	<br /><br />	public function parseResponse()<br />	{}<br />	public function __destruct()<br />	{<br />		//fclose($this->connect);<br />	} <br />}<br />set_time_limit(60);<br />$http=new Httpwrap("http://www.mmkao.com/Beautyleg/");<br />//设置HTTP请求行<br />$http->setRequestLine("get");<br />//设置HTTP头<br />$http->setRequestHeader(array("Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"));<br />$http->setRequestHeader(array("Accept-Language" => "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"));<br />$http->setRequestHeader(array("Accept-Encoding" => "gzip, deflate"));<br />$http->setRequestHeader(array("User-Agent" => "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.101 Safari/537.36"));<br />//$http->setRequestHeader(array("Cookie" => "BAIDU_DUP_lcr=http://www.baidu.com/s?wd=beautyleg&rsv_spt=1&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=6&rsv_sug4=415&rsv_sug1=3&oq=beauty&rsv_sug2=0&rsp=0&inputT=2363; safedog-flow-item=8471BA510DA33350ED344AC374D3044A; bdshare_firstime=1415165097782; cscpvrich_fidx=6; AJSTAT_ok_pages=2; AJSTAT_ok_times=2; CNZZDATA3811623=cnzz_eid%3D253823549-1415164312-http%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1415169712"));<br />//发送数据<br />$http->sendRequest();<br />//$http->receiveResponseHeader();<br /><br />?><br /><br />通过这个类给领一个自定义的脚本,可以发送和接收数据,领一个脚本如下:<br /><br /><?php <br />if(!empty($_POST))<br />{<br />	$str=implode(',',$_POST);<br />	file_put_contents('./post.txt', $str,FILE_APPEND);<br />	echo $str;<br />}<br /><br />?><br />但是给这个网站发送请求时,却超时:网站是:<br />http://www.mmkao.com/Beautyleg/<br />通过chrome给这个网站首页发送请求时的header头信息:<br />Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8<br />Accept-Encoding:gzip,deflate,sdch<br />Accept-Language:zh,en;q=0.8,zh-TW;q=0.6,zh-CN;q=0.4,ja;q=0.2<br />Cache-Control:max-age=0<br />Connection:keep-alive<br />Cookie:BAIDU_DUP_lcr=http://www.baidu.com/s?wd=beautyleg&rsv_spt=1&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=6&rsv_sug4=415&rsv_sug1=3&oq=beauty&rsv_sug2=0&rsp=0&inputT=2363; safedog-flow-item=8471BA510DA33350ED344AC374D3044A; bdshare_firstime=1415165097782; cscpvrich_fidx=7; AJSTAT_ok_pages=3; AJSTAT_ok_times=2; CNZZDATA3811623=cnzz_eid%3D253823549-1415164312-http%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1415169712<br />DNT:1<br />Host:www.mmkao.com<br />User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.101 Safari/537.36<br />Response Headersview source<br /><br />//通过相同的包装,并调用Httpwrap发送请求时,却提示超时,是在不知道哪里出问题........<br /><br />针对这个网站写了一个过滤出图片链接的类:<br /><br /><?php  <br />class Parseimage<br />{<br />	private $responseBody=null;<br />	private $imgLink=null;<br />	private $pageNum=null;<br />	private header=null;<br />	private body=null;<br />	<br />	public function __construct($body)<br />	{<br />		$this->responseBody=$body;<br />	}<br />	//匹配图片src开始的链接地址<br />	public function feedImage()<br />	{<br />		$pat='#<img  src="/static/imghw/default1.png"  data-src="(.*?)(?="  class="lazy" (.*?))#i';<br / alt="自定义HTTP抓包跟过滤" >		if(preg_match_all($pat, $body, $match))<br />		{<br />			foreach($match[2] as $link)<br />			{<br />				$this->imgLink[]=$link;<br />			}<br />		}<br />		else<br />		{<br />			echo '匹配失败图片链接地址失败'."<br />";<br />		}<br />	}<br />	//提取head部分<br />	public function filterHeader($body)<br />	{<br />		$pat='#<head>[\s\S]+</head>#im';<br />		if(preg_match($pat, $body, $match))<br />		{<br />			$this->header=$match[0];<br />		}<br />		else<br />		{<br />			echo '匹配head部分失败'."<br />";<br />		}<br />	}<br />	//提取body部分<br />	public function filterBody($body)<br />	{<br />		$pat='#<body>[\s\S]+</body>#im';<br />		if(preg_match($pat, $body, $match))<br />		{<br />			$this->body=$match[0];<br />		}<br />		else<br />		{<br />			echo '匹配body部分失败'."<br />";<br />		}<br />	}<br />	//提取分页信息,这个只能针对性的匹配,不能通用<br />	public function rollPage($body)<br />	{<br />		$pat='#[\x{4e00}-\x{9fa5}]+\s*\d\s+?/\s+?\d+\s*[\x{4e00}-\x{9fa5}]*#ui';<br />		if(preg_match($pat, $body, $match))<br />		{<br />			$patNum='#/\s*(\d\d*)#';<br />			if(preg_match($patNum, $match[0], $num))<br />			{<br />				$this->pageNum=$num[1];<br />			}<br />			else<br />			{<br />				echo '提取分页具体值失败'."<br />";<br />			}<br />		}<br />		else<br />		{<br />			echo '提取分页统计失败'."<br />";<br />		}<br />	}<br /><br />?><br /><br /><br /><br />附注:  这两个类,,都通过了内网的测试,并成功过滤出图片的链接,但是给http://www.mmkao.com/Beautyleg/发送请求时,却提示超时,,不知道哪里出了问题。。。。。。<br /><br /><br /><br /><br />
로그인 후 복사

------解决思路----------------------
$url = 'http://www.mmkao.com/Beautyleg/';<br />print_r(get_headers($url));
로그인 후 복사
Array<br />(<br />    [0] => HTTP/1.1 200 OK<br />    [1] => Connection: close<br />    [2] => Date: Wed, 05 Nov 2014 08:53:09 GMT<br />    [3] => Content-Length: 13889<br />    [4] => Content-Type: text/html<br />    [5] => Content-Location: http://www.mmkao.com/Beautyleg/index.html<br />    [6] => Last-Modified: Wed, 05 Nov 2014 05:39:09 GMT<br />    [7] => Accept-Ranges: bytes<br />    [8] => ETag: "e8939ad2baf8cf1:693"<br />    [9] => Server: IIS<br />    [10] => X-Powered-By: WAF/2.0<br />    [11] => Set-Cookie: safedog-flow-item=8471BA510DA33350ED344AC374D3044A; expires=Sat, 12-Dec-2150 10:26:25 GMT; domain=mmkao.com; path=/<br />)<br /><br />
로그인 후 복사

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

해결 방법: 조직에서 PIN 변경을 요구합니다. 해결 방법: 조직에서 PIN 변경을 요구합니다. Oct 04, 2023 pm 05:45 PM

로그인 화면에 "귀하의 조직에서 PIN 변경을 요구합니다"라는 메시지가 나타납니다. 이는 개인 장치를 제어할 수 있는 조직 기반 계정 설정을 사용하는 컴퓨터에서 PIN 만료 제한에 도달한 경우 발생합니다. 그러나 개인 계정을 사용하여 Windows를 설정하는 경우 이상적으로는 오류 메시지가 나타나지 않습니다. 항상 그런 것은 아니지만. 오류가 발생한 대부분의 사용자는 개인 계정을 사용하여 신고합니다. 조직에서 Windows 11에서 PIN을 변경하도록 요청하는 이유는 무엇입니까? 귀하의 계정이 조직과 연결되어 있을 수 있으므로 이를 확인하는 것이 기본 접근 방식입니다. 도메인 관리자에게 문의하면 도움이 될 수 있습니다! 또한 잘못 구성된 로컬 정책 설정이나 잘못된 레지스트리 키로 인해 오류가 발생할 수 있습니다. 지금 바로

화웨이 GT3 Pro와 GT4의 차이점은 무엇입니까? 화웨이 GT3 Pro와 GT4의 차이점은 무엇입니까? Dec 29, 2023 pm 02:27 PM

많은 사용자들이 스마트 시계를 선택할 때 Huawei 브랜드를 선택하게 됩니다. 그 중 Huawei GT3pro와 GT4가 가장 인기 있는 선택입니다. 두 제품의 차이점을 궁금해하는 사용자가 많습니다. Huawei GT3pro와 GT4의 차이점은 무엇입니까? 1. 외관 GT4: 46mm와 41mm, 재질은 유리 거울 + 스테인레스 스틸 본체 + 고해상도 섬유 후면 쉘입니다. GT3pro: 46.6mm 및 42.9mm, 재질은 사파이어 유리 + 티타늄 본체/세라믹 본체 + 세라믹 백 쉘입니다. 2. 건강한 GT4: 최신 Huawei Truseen5.5+ 알고리즘을 사용하면 결과가 더 정확해집니다. GT3pro: ECG 심전도, 혈관 및 안전성 추가

Windows 11에서 밝기를 조정하는 10가지 방법 Windows 11에서 밝기를 조정하는 10가지 방법 Dec 18, 2023 pm 02:21 PM

화면 밝기는 최신 컴퓨팅 장치를 사용할 때 필수적인 부분이며, 특히 화면을 장시간 볼 때 더욱 그렇습니다. 눈의 피로를 줄이고, 가독성을 높이며, 콘텐츠를 쉽고 효율적으로 보는 데 도움이 됩니다. 그러나 설정에 따라 밝기 관리가 어려울 수 있으며, 특히 새로운 UI 변경이 적용된 Windows 11에서는 더욱 그렇습니다. 밝기를 조정하는 데 문제가 있는 경우 Windows 11에서 밝기를 관리하는 모든 방법은 다음과 같습니다. Windows 11에서 밝기를 변경하는 방법 [10가지 설명] 단일 모니터 사용자는 다음 방법을 사용하여 Windows 11에서 밝기를 조정할 수 있습니다. 여기에는 단일 모니터를 사용하는 데스크탑 시스템과 노트북이 포함됩니다. 시작하자. 방법 1: 알림 센터 사용 알림 센터에 액세스할 수 있습니다.

http 상태 코드 520은 무엇을 의미합니까? http 상태 코드 520은 무엇을 의미합니까? Oct 13, 2023 pm 03:11 PM

HTTP 상태 코드 520은 서버가 요청을 처리하는 동안 알 수 없는 오류가 발생하여 더 구체적인 정보를 제공할 수 없음을 의미합니다. 서버가 요청을 처리하는 동안 알 수 없는 오류가 발생했음을 나타내는 데 사용됩니다. 이는 서버 구성 문제, 네트워크 문제 또는 기타 알 수 없는 이유로 인해 발생할 수 있습니다. 이는 일반적으로 서버 구성 문제, 네트워크 문제, 서버 과부하 또는 코딩 오류로 인해 발생합니다. 상태 코드 520 오류가 발생하면 웹사이트 관리자나 기술 지원팀에 문의하여 자세한 정보와 지원을 받는 것이 가장 좋습니다.

Safari에서 iPhone의 개인 브라우징 인증을 끄는 방법은 무엇입니까? Safari에서 iPhone의 개인 브라우징 인증을 끄는 방법은 무엇입니까? Nov 29, 2023 pm 11:21 PM

iOS 17에서 Apple은 모바일 운영 체제에 몇 가지 새로운 개인 정보 보호 및 보안 기능을 도입했습니다. 그 중 하나는 Safari의 개인 탐색 탭에 대해 2단계 인증을 요구하는 기능입니다. 작동 방식과 끄는 방법은 다음과 같습니다. iOS 17 또는 iPadOS 17을 실행하는 iPhone 또는 iPad에서 Safari에 개인 정보 보호 브라우징 탭이 열려 있는 경우 이제 Apple 브라우저에 Face ID/Touch ID 인증이나 암호가 필요하며, 다시 액세스하려면 세션이나 앱을 종료해야 합니다. 즉, 잠금이 해제된 iPhone이나 iPad를 다른 사람이 손에 넣는 경우에도 비밀번호를 모르면 개인정보를 볼 수 없습니다.

Win10/11 디지털 활성화 스크립트 MAS 버전 2.2는 디지털 활성화를 다시 지원합니다. Win10/11 디지털 활성화 스크립트 MAS 버전 2.2는 디지털 활성화를 다시 지원합니다. Oct 16, 2023 am 08:13 AM

유명한 활성화 스크립트 MAS2.2 버전은 @asdcorp에서 시작된 방법이며 MAS 작성자는 이를 HWID2라고 부릅니다. https://github.com/massgravel/Microsoft-Activation-Scriptsgatherosstate.exe(원래 버전 아님, 수정됨)를 다운로드하고 매개변수를 사용하여 실행한 후 GenuineTicket.xml 티켓을 생성하세요. 먼저 원래 방법(gatherosstate.exePfn=xxxxxxx;DownlevelGenuineState=1)을 살펴본 다음 최신 방법(gatheros)과 비교해 보세요.

http 상태 코드 403이란 무엇입니까? http 상태 코드 403이란 무엇입니까? Oct 07, 2023 pm 02:04 PM

HTTP 상태 코드 403은 서버가 클라이언트의 요청을 거부했음을 의미합니다. http 상태 코드 403에 대한 해결 방법은 다음과 같습니다. 1. 서버에 인증이 필요한 경우 올바른 자격 증명이 제공되었는지 확인합니다. 2. 서버가 IP 주소를 제한한 경우 클라이언트의 IP 주소가 제한되어 있거나 블랙리스트에 없습니다. 3. 파일 권한 설정을 확인하십시오. 403 상태 코드가 파일 또는 디렉토리의 권한 설정과 관련되어 있으면 클라이언트가 해당 파일 또는 디렉토리에 액세스할 수 있는 권한이 있는지 확인하십시오. 등.

웹 페이지 리디렉션의 일반적인 애플리케이션 시나리오를 이해하고 HTTP 301 상태 코드를 이해합니다. 웹 페이지 리디렉션의 일반적인 애플리케이션 시나리오를 이해하고 HTTP 301 상태 코드를 이해합니다. Feb 18, 2024 pm 08:41 PM

HTTP 301 상태 코드의 의미 이해: 웹 페이지 리디렉션의 일반적인 응용 시나리오 인터넷의 급속한 발전으로 인해 사람들은 웹 페이지 상호 작용에 대한 요구 사항이 점점 더 높아지고 있습니다. 웹 디자인 분야에서 웹 페이지 리디렉션은 HTTP 301 상태 코드를 통해 구현되는 일반적이고 중요한 기술입니다. 이 기사에서는 HTTP 301 상태 코드의 의미와 웹 페이지 리디렉션의 일반적인 응용 프로그램 시나리오를 살펴봅니다. HTTP301 상태 코드는 영구 리디렉션(PermanentRedirect)을 나타냅니다. 서버가 클라이언트의 정보를 받을 때

See all articles