043-socket程式設計傳送GET請求
格式亂 請看http://note.youdao.com/s/chq2jO79
php+socket請求原理
1:連線某URL的80埠(開啟)
2:傳送頭資訊(寫)
3:讀取網頁內容(讀)
GET方法
<?php /* PHP+socket程式設計 傳送請求 要求能 模擬下載、註冊、登陸、批量發帖 */ //http請求類的介面 interface proto{ //連線url function conn($url); //傳送get查詢 function get(); //傳送post查詢 function post(); //關閉連線 function close(); } Class Http implements Proto{ const CRLF ="\r\n"; protected $erron=-1; protected $errstr=''; protected $response=''; protected $url=null; protected $version='HTTP/1.1'; protected $fh=null; protected $line=array(); protected $header=array(); protected $body=array(); public function _construct($url){ $this->conn($url); $this->setHeader('Host:' .$this->url['host'] ); } //此方法負責寫請求行 protected function setLine($method){ $this->Line[0]=$method . '' . $this->url['path'] . ' ' . $this->version; } //此方法負責寫頭資訊 protected function setHeader($hederline){ $this->header[]=$headerline; } //此方法負責寫主體資訊 protected function setBody(){ } //連線url public function conn($url){ $this->url= parse_url($url); //判斷埠 if(isset($this->url['port'])){ $this->url['port']=80; } $this->fh= fsockopen($this->url['host'],$this->url['port'],$this->errno,$this->errstr,3); } //構造get請求的資料 public function get(){ $this->setLine('GET'); $this->request(); return $this->response; } //構造post查詢的資料 public function post(){ } //真正請求 public function request(){ //把請求行,頭資訊,實體資訊,放在一個陣列中,便於拼接 $req=array_merge($this->line,$this- >header,array(''),$this->body,array('')); //print_r($req); $req=implode(self::CRLF,$req); //echo $req; fwrite($this->fh,$req); while(!feof($this->fh)){ $this->response.=fread($this->fh,1024); } $this->close();//關閉連線 return $this->response; } //關閉連線 function close(){ } } /* $url='http://renjian.163.com/20/1019/11/FPA1LP5V000181RV.html'; $http=new Http($url); echo $http->get(); */
POST傳送
<?php /* PHP+socket程式設計 傳送請求 要求能 模擬下載、註冊、登陸、批量發帖 */ //http請求類的介面 interface proto{ //連線url function conn($url); //傳送get查詢 function get(); //傳送post查詢 function post(); //關閉連線 function close(); } Class Http implements Proto{ const CRLF ="\r\n"; protected $erron=-1; protected $errstr=''; protected $response=''; protected $url=null; protected $version='HTTP/1.1'; protected $fh=null; protected $line=array(); protected $header=array(); protected $body=array(); public function _construct($url){ $this->conn($url); $this->setHeader('Host:' .$this->url['host'] ); } //此方法負責寫請求行 protected function setLine($method){ $this->Line[0]=$method . '' . $this->url['path'] . ' ' . $this->version; } //此方法負責寫頭資訊 protected function setHeader($hederline){ $this->header[]=$headerline; } //此方法負責寫主體資訊 protected function setBody($boby){ $this->boby[]=http_build_query($body); } //連線url public function conn($url){ $this->url= parse_url($url); //判斷埠 if(isset($this->url['port'])){ $this->url['port']=80; } $this->fh= fsockopen($this->url['host'],$this->url['port'],$this->errno,$this->errstr,3); } //構造get請求的資料 public function get(){ $this->setLine('GET'); $this->request(); return $this->response; } //構造post查詢的資料 public function post($boby=array()){ $this->setLine('POST'); //設計content-type $this->setHeader('Content-type:application/x-www-form-urlencoded') //設計主題資訊,比GET不一樣的地方 $this->setBoby($boby); $this->request(); //計算content-length $this->setHeader('Content-length:' . strlen($this->boby[0])) } //真正請求 public function request(){ //把請求行,頭資訊,實體資訊,放在一個陣列中,便於拼接 $req=array_merge($this->line,$this- >header,array(''),$this->boby,array('')); //print_r($req); $req=implode(self::CRLF,$req); //echo $req;exit; fwrite($this->fh,$req); while(!feof($this->fh)){ $this->response.=fread($this->fh,1024); } $this->close();//關閉連線 return $this->response; } //關閉連線 public function close(){ fclose($this->fh); } } /* $url='http://renjian.163.com/20/1019/11/FPA1LP5V000181RV.html'; $http=new Http($url); echo $http->get(); */ set_time_limit(0); $url='http://renjian.163.com/20/1019/11/FPA1LP5V000181RV.html'; for($i=1;$i<100;$i++){ $str=str_shuffle'abcdfghijkimnopqrst0776656'; $tit=substr($str,0,5); $con=substr($str,6,8); $http=new Http($url); echo $http->post(array('tit'=>$tit,'con'=>$con,'submit'=>'留言')); echo $tit,'-----------',$con,'<br />'; usleep(2000); }
無狀態?
2次請求之間沒有關係
?伺服器如何記住一個客戶?
cookie 模擬登入發貼,cookie可以記住使用者
<?php require('./http.class.php') $http=new Http('http://home.verycd.com/cp.php?ac=pm&op=send&touid=0&pmid=0'); $http->setHeader('Referer: '); $http->setHeader('User-Agent: '); $http->setHeader('cookie: '); $msg =array( 'formhash'=>'4f23e777', 'message'=>'world', 'pmsubmit'=>'true', 'pmsubmit_btn'=>'傳送', 'refer'=>'http://home.verycd.com/space.php?do=pm&filter=privatepm', 'username'=>'http接收' ); file_put_contents('./res.htlm' $http->post($msg )); echo '0k';
Http協議之referer防盜鏈
當我們在網頁裡引用站外圖片時,會出現上述情況。那麼伺服器是怎麼知道這個圖片是在站外被引用的呢?
在Http協議中,頭資訊裡有一個重要的選項:Referer,代表網頁的來源,既上一頁的地址,如果是直接在瀏覽器上輸入地址,回車進來,則沒有Referer。
配置apache伺服器,用於圖片防盜鏈?
原理:在web伺服器層面,根據http協議的referer頭資訊來判斷。如果來自站外,則統一重寫到一個很小的防盜鏈圖片上去。
具體步驟:1.開啟apache重寫模組mod_rewrite,2.在需要防盜鏈的網站或目錄,寫.htaccess檔案,並指定防盜鏈規則,分析referer資訊,如果不是來自本站,則重寫。
重寫規則:
①哪種情況下重寫:是jpeg/jpg/gif/png圖片時,referer頭與localhost不匹配時重寫,統一rewrite到某個防盜鏈圖片
RewriteEngine OnRewrite Base /test RewriteCond %{REQUEST_FILENAME} .*\.(jpg|jpeg|gif|png) [NC] RewriteCond %{HTTP_REFERER} !localhost [NC] RewriteRule .* no.png
偽造referer頭採集防盜鏈圖片:
<?php require('./http.class.php'); $http = new Http('http://localhost/test/test.jpg'); //圖片路徑 $http->setHeader('Referer: http://localhost'); //偽造referer $res = $http->get(); //應該判斷路徑或response的mime頭資訊,來確定圖片的型別 file_put_contents('./aa.jpg',substr(strstr($res,"\r\n\r\n"),4));
相關文章
- 傳送GET請求 示例
- 使用HttpClient傳送GET請求HTTPclient
- java傳送GET和post請求Java
- PHP傳送POST和GET請求PHP
- httprequest- post- get -傳送請求HTTP
- php 利用socket傳送GET,POST請求PHP
- java傳送http的get、post請求JavaHTTP
- java傳送get請求帶引數Java
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- 【轉】怎麼用PHP傳送HTTP請求(POST請求、GET請求)?PHPHTTP
- Go使用net/http庫傳送GET請求GoHTTP
- postman(二):使用postman傳送get or post請求Postman
- file_get_contents傳送post請求
- Go HTTP GET 請求可以傳送 body 嗎GoHTTP
- cURL實現傳送Get和Post請求(PHP)PHP
- Go語言開發傳送Get和Post請求Go
- HTTP GET請求傳bodyHTTP
- Golang:使用go-resty/resty傳送http請求get和postGolangRESTHTTP
- Postman傳送Post請求Postman
- Java傳送Post請求Java
- HttpClient--傳送請求HTTPclient
- perl傳送http請求HTTP
- java傳送http請求JavaHTTP
- Java用HttpClient3傳送http/https協議get/post請求,傳送map,jsoJavaHTTPclient協議JS
- 如何傳送請求以及AJAX
- C# 傳送POST請求C#
- 使用httpclient傳送http請求HTTPclient
- 網路程式設計基礎,模擬get post請求程式設計
- Android 傳送HTTP GET POST 請求以及通過 MultipartEntityBuilder 上傳檔案(二)AndroidHTTPUI
- Zttp 傳送 form params 請求 而非 JSON 請求ORMJSON
- python+pytest介面自動化(4)-requests傳送get請求Python
- java apache commons HttpClient傳送get和post請求的學習整理JavaApacheHTTPclient
- iOS開發那些事-iOS網路程式設計同步GET方法請求程式設計iOS程式設計
- 使用Feign傳送HTTP請求HTTP
- python傳送HTTP POST請求PythonHTTP
- post 封裝Map 傳送請求封裝
- postman傳送請求使用篇(二)Postman
- Python傳送請求代tokenPython