ホームページ バックエンド開発 PHPチュートリアル カスタマイズされたHTTPパケットのキャプチャとフィルタリング

カスタマイズされたHTTPパケットのキャプチャとフィルタリング

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

カスタマイズされた HTTP パケット キャプチャとフィルタリング
HTTP パケット キャプチャ クラスを定義し、カスタム受信スクリプトにデータを送信することはできますが、外部ネットワークに送信することはできません。 HTTP リクエスト送信時のリクエスト ヘッダー情報がシミュレートされますが、リクエストがタイムアウトします...

<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="(.*?)(?=")#i';<br />		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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

解決策: 組織では PIN を変更する必要があります。 解決策: 組織では PIN を変更する必要があります。 Oct 04, 2023 pm 05:45 PM

ログイン画面に「組織から PIN の変更を求められています」というメッセージが表示されます。これは、個人のデバイスを制御できる組織ベースのアカウント設定を使用しているコンピューターで PIN の有効期限の制限に達した場合に発生します。ただし、個人アカウントを使用して Windows をセットアップした場合、エラー メッセージは表示されないのが理想的です。常にそうとは限りませんが。エラーが発生したほとんどのユーザーは、個人アカウントを使用して報告します。私の組織が Windows 11 で PIN を変更するように要求するのはなぜですか?アカウントが組織に関連付けられている可能性があるため、主なアプローチはこれを確認することです。ドメイン管理者に問い合わせると解決できます。さらに、ローカル ポリシー設定が間違っていたり、レジストリ キーが間違っていたりすると、エラーが発生する可能性があります。今すぐ

Huawei GT3 ProとGT4の違いは何ですか? Huawei GT3 ProとGT4の違いは何ですか? Dec 29, 2023 pm 02:27 PM

多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ 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 エラーが発生した場合は、Web サイト管理者またはテクニカル サポート チームに連絡して詳細情報と支援を得ることが最善です。

iPhoneのSafariでプライベートブラウジング認証をオフにする方法は? iPhoneのSafariでプライベートブラウジング認証をオフにする方法は? Nov 29, 2023 pm 11:21 PM

iOS 17 では、Apple はモバイル オペレーティング システムにいくつかの新しいプライバシーおよびセキュリティ機能を導入しました。その 1 つは、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-Scripts から Gatherosstate.exe (オリジナルではなく、変更されたもの) をダウンロードし、パラメータを指定して実行し、AuthenticTicket.xml を生成します。まず元のメソッド: Gatherosstate.exePfn=xxxxxxx;DownlevelOriginalState=1 を確認し、次に最新のメソッド: Gatheros と比較します。

httpステータスコード403とは何ですか? httpステータスコード403とは何ですか? Oct 07, 2023 pm 02:04 PM

HTTP ステータス コード 403 は、サーバーがクライアントの要求を拒否したことを意味します。 http ステータス コード 403 の解決策は次のとおりです: 1. 認証資格情報を確認します。サーバーが認証を必要とする場合は、正しい資格情報が提供されていることを確認します。2. IP アドレス制限を確認します。サーバーが IP アドレスを制限している場合は、クライアントの IP アドレスは制限されています。ホワイトリストに登録されているか、ブラックリストに登録されていません。3. ファイルのアクセス許可設定を確認します。403 ステータス コードがファイルまたはディレクトリのアクセス許可設定に関連している場合は、クライアントがこれらのファイルまたはディレクトリにアクセスするための十分なアクセス許可を持っていることを確認してください。等

Web ページのリダイレクトの一般的なアプリケーション シナリオを理解し、HTTP 301 ステータス コードを理解する Web ページのリダイレクトの一般的なアプリケーション シナリオを理解し、HTTP 301 ステータス コードを理解する Feb 18, 2024 pm 08:41 PM

HTTP 301 ステータス コードの意味を理解する: Web ページ リダイレクトの一般的なアプリケーション シナリオ インターネットの急速な発展に伴い、Web ページの操作に対する人々の要求はますます高くなっています。 Web デザインの分野では、Web ページのリダイレクトは一般的かつ重要なテクノロジであり、HTTP 301 ステータス コードによって実装されます。この記事では、HTTP 301 ステータス コードの意味と、Web ページ リダイレクトにおける一般的なアプリケーション シナリオについて説明します。 HTTP301 ステータス コードは、永続的なリダイレクト (PermanentRedirect) を指します。サーバーがクライアントのメッセージを受信すると、

See all articles