您好,登錄后才能下訂單哦!
今天小編給大家分享的是關于PHP中的fsockopen函數使用方法,很多人都不太了解,今天小編為了讓大家更加了解PHP中的fsockopen函數,所以給大家總結了以下內容,一起往下看吧。一定會有所收獲的哦。
PHP fsockopen是一個功能比較強大的函數。我們在這篇文章中將會對這個函數做一個具體的介紹,希望對大家有所幫助。記得以前的B2C網站就是通過這個函數實現前臺和訂單處理系統的交互。
PHP fsockopen函數說明:
語法:
resource fsockopen ( string $hostname [, int KaTeX parse error: Expected 'EOF', got '&' at position 20: … = -1 [, int &?errno [, string &$errstr [, float $timeout = ini_get(“default_socket_timeout”) ]]]] )
開啟PHP fsockopen這個函數
PHP fsockopen需要 PHP.ini 中 allow_url_fopen 選項開啟。
allow_url_fopen = On
參數:
hostname:如果安裝了OpenSSL,那么你也許應該在你的主機名地址前面添加訪問協議ssl://或者是tls://,從而可以使用基于TCP/IP協議的SSL或者TLS的客戶端連接到遠程主機。
port:端口號。如果對該參數傳一個-1,則表示不使用端口,例如unix://。
errno:如果errno的返回值為0,而且這個函數的返回值為 FALSE ,那么這表明該錯誤發生在套接字連接(connect())調用之前,導致連接失敗的原因最大的可能是初始化套接字的時候發生了錯誤。
errstr:錯誤信息將以字符串的信息返回。
timeout:設置連接的時限,單位為秒。
返回值:
fsockopen() 將返回一個文件句柄,之后可以被其他文件類函數調用(例如: fgets() , fgetss() , fwrite() , fclose() 還有 feof() )。如果調用失敗,將返回 FALSE 。
php fsockopen使用案例
1、fsockopen 來模擬生成 HTTP 連接
<?php $fp = fsockopen("127.0.0.1",80,$errno,$errstr,30); if(!$fp){ echo "$errstr ($errno)<br />\n"; }else{ $out = "GET / HTTP/1.1\r\n"; $out .= "Host: 127.0.0.1\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp,$out); $content = ''; while(!feof($fp)){ $content .= fgets($fp,128); } echo $content; fclose($fp); } ?>
運行結果:
2、PHP fsockopen模擬POST/GET方法
fsockopen除了像上面實例模擬生成 HTTP 連接之外,還能實現很多功能,比如模擬post 和 get 傳送數據的方法。
get :
<?php $url = "http://localhost/test2.php?site=www.tbrer.com"; print_r(parse_url($url));// 解析 URL,返回其組成部分 /* get提交 */ sock_get($url,'user=gonn'); // fsocket模擬get提交 function sock_get($url,$query){ $data = array( 'foo' => 'bar', 'baz' => 'boom', 'site' => 'www.tbrer.com', 'name' => 'nowa magic' ); $query_str = http_build_query($data);// http_build_query()函數的作用是使用給出的關聯(或下標)數組生成一個經過 URL-encode 的請求字符串 $info = parse_url($url); $fp = fsockopen($info["host"],80,$errno,$errstr,30); $head = "GET " . $info['path'] . '?' . $query_str . " HTTP/1.0\r\n"; $head .= "Host: " . $info['host'] . "\r\n"; $head .= "\r\n"; $write = fputs($fp,$head); while(!feof($fp)){ $line = fread($fp,4096); echo $line; } } ?>
post :
<?php $url = "http://localhost/test2.php?site=www.tbrer.com"; print_r(parse_url($url));// 解析 URL,返回其組成部分 /* get提交 */ sock_post($url,'user=gonn'); // fsocket模擬get提交 function sock_post($url,$query){ $info = parse_url($url); $fp = fsockopen($info["host"],80,$errno,$errstr,30); $head = "POST " . $info['path'] . "?" . $info["query"] . " HTTP/1.0\r\n"; $head .= "Host: " . $info['host'] . "\r\n"; $head .= "Referer: http://" . $info['host'] . $info['path'] . "\r\n"; $head .= "Content-type: application/x-www-form-urlencoded\r\n"; $head .= "Content-Length: ". strlen(trim($query)) . "\r\n"; $head .= "\r\n"; $head .= trim($query); $write = fputs($fp,$head); while(!feof($fp)){ $line = fread($fp,4096); echo $line; } } ?>
接收頁面 test2.php 的代碼為:
<?php $data = $_REQUEST; echo '<pre>'; print_r($data); echo '</pre>'; ?>
3、fsockopen以Socket方式模擬HTTP下載文件
<?php /* * Socket 模擬HTTP協議傳輸文件 * Http是應用層協議使用80端口 */ $hostname = '127.0.0.1'; $port = '80'; // 建立連接 $fp = fsockopen($hostname,$port,$errno,$errstr); stream_set_blocking($fp,true); if(!$fp){ echo "$errno : $errstr<br />"; }else{ // 發送一個HTTP請求信息頭 $request_header = "GET /aaa.txt"; // 起始行 // 頭域 $request_header .= "Host: $hostname\n"; // 再一個回車換行表示頭信息結束 $request_header .= "\n"; // 發送請求到服務器 fputs($fp,$request_header); // 接受響應 $fp2 = fopen('aaa.txt','w'); while(!feof($fp)){ $line = fputs($fp2,fgets($fp,128)); echo $line; } // 關閉 fclose($fp2); fclose($fp); } ?>
執行程序,你會發現在這個程序文件的同級目錄就會出現那個你需要下載的文件了。
這實質上是 Socket 模擬HTTP協議傳輸文件。同時還要注意一下 PHP 的超時限制,這里設置我 PHP 服務器超時為無限才能正確下載,否則可能下載不全 PHP 程序就停止了。
注意:
bool stream_set_blocking ( resource $stream , int $mode )
為 stream 設置阻塞或者阻塞模。
此函數適用于支持非阻塞模式的任何資源流(常規文件,套接字資源流等)。
參數
stream:資源流。
mode:如果 mode 為0,資源流將會被轉換為非阻塞模式;如果是1,資源流將會被轉換為阻塞模式。 該參數的設置將會影響到像 fgets() 和 fread() 這樣的函數從資源流里讀取數據。 在非阻塞模式下,調用 fgets() 總是會立即返回;而在阻塞模式下,將會一直等到從資源流里面獲取到數據才能返回。
返回值
成功時返回 TRUE, 或者在失敗時返回 FALSE。
4、使用 fsockopen 偽造來路
<?php $host = "127.0.0.1"; //你要訪問的域名 $ip = '127.0.0.1'; $target = "/test2.php"; //你要訪問的頁面地址 $referer = "http://www.neiyidaogou.com/"; //偽造來路頁面 //$fp = fsockopen($host, 80, $errno, $errstr, 30); $fp = fsockopen($ip, 80, $errno, $errstr, 30); if(!$fp) { echo "$errstr($errno)<br />\n"; } else { $end = "\r\n"; $out = "GET $target HTTP/1.1$end"; $out .= "Host: $ip$end"; $out .= "Referer: $referer$end"; $out .= "Connection: Close$end"; $out .= "$end"; fwrite($fp, $out); while(!feof($fp)) { echo fgets($fp, 1024); } fclose($fp); } ?>
test2.php 的代碼為:
<?php $data = $_REQUEST; echo '<pre>'; print_r($data); echo '</pre>'; ?>
可以看到 HTTP_REFERER 的值為 http://www.neiyidaogou.com/,即來路已經偽造成功。
關于關于PHP中的fsockopen函數使用方法就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。