自定义HTTP抓包跟过滤
自定义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 />

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

“你的组织要求你更改PIN消息”将显示在登录屏幕上。当在使用基于组织的帐户设置的电脑上达到PIN过期限制时,就会发生这种情况,在该电脑上,他们可以控制个人设备。但是,如果您使用个人帐户设置了Windows,则理想情况下不应显示错误消息。虽然情况并非总是如此。大多数遇到错误的用户使用个人帐户报告。为什么我的组织要求我在Windows11上更改我的PIN?可能是您的帐户与组织相关联,您的主要方法应该是验证这一点。联系域管理员会有所帮助!此外,配置错误的本地策略设置或不正确的注册表项也可能导致错误。即

屏幕亮度是使用现代计算设备不可或缺的一部分,尤其是当您长时间注视屏幕时。它可以帮助您减轻眼睛疲劳,提高易读性,并轻松有效地查看内容。但是,根据您的设置,有时很难管理亮度,尤其是在具有新UI更改的Windows11上。如果您在调整亮度时遇到问题,以下是在Windows11上管理亮度的所有方法。如何在Windows11上更改亮度[10种方式解释]单显示器用户可以使用以下方法在Windows11上调整亮度。这包括使用单个显示器的台式机系统以及笔记本电脑。让我们开始吧。方法1:使用操作中心操作中心是访问

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安

http状态码520是指服务器在处理请求时遇到了一个未知的错误,无法提供更具体的信息。用于表示服务器在处理请求时发生了一个未知的错误,可能是由于服务器配置问题、网络问题或其他未知原因导致的。通常是由服务器配置问题、网络问题、服务器过载或代码错误等原因导致的。如果遇到状态码520错误,最好联系网站管理员或技术支持团队以获取更多的信息和帮助。

在iOS17中,Apple为其移动操作系统引入了几项新的隐私和安全功能,其中之一是能够要求对Safari中的隐私浏览选项卡进行二次身份验证。以下是它的工作原理以及如何将其关闭。在运行iOS17或iPadOS17的iPhone或iPad上,如果您在Safari浏览器中打开了任何“无痕浏览”标签页,然后退出会话或App,Apple的浏览器现在需要面容ID/触控ID认证或密码才能再次访问它们。换句话说,如果有人在解锁您的iPhone或iPad时拿到了它,他们仍然无法在不知道您的密码的情况下查看您的隐私

著名的激活脚本MAS2.2版本重新支持数字激活,方法源于@asdcorp及团队,MAS作者称之为HWID2。https://github.com/massgravel/Microsoft-Activation-Scripts下载gatherosstate.exe(非原版,已改造),带参数运行它,生成门票GenuineTicket.xml。先看一下原先的方法:gatherosstate.exePfn=xxxxxxx;DownlevelGenuineState=1再对比一下最新方法:gatheros

http状态码403是服务器拒绝了客户端的请求的意思。解决http状态码403的方法是:1、检查身份验证凭据,如果服务器要求身份验证,确保提供正确的凭据;2、检查IP地址限制,如果服务器对IP地址进行了限制,确保客户端的IP地址被列入白名单或未列入黑名单;3、检查文件权限设置,如果403状态码与文件或目录的权限设置有关,确保客户端具有足够的权限访问这些文件或目录等等。

掌握HTTP301状态码的含义:网页重定向的常见应用场景随着互联网的迅猛发展,人们对网页交互的要求也越来越高。在网页设计领域,网页重定向是一种常见且重要的技术,通过HTTP301状态码来实现。本文将探讨HTTP301状态码的含义以及在网页重定向中的常见应用场景。HTTP301状态码是指永久重定向(PermanentRedirect)。当服务器接收到客户端发
