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 連接

n";
    }else{
 $out = "GET / HTTP/1.1rn";
 $out .= "Host: 127.0.0.1rn";
 $out .= "Connection: Closernrn";
 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 :

 '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.0rn";
    $head .= "Host: " . $info['host'] . "rn";
    $head .= "rn";
    $write = fputs($fp,$head);
    while(!feof($fp)){
 $line = fread($fp,4096);
 echo $line;
    }
}
?>

post :

m($query)) . "rn";
    $head .= "rn";
    $head  .= trim($query);
    $write = fputs($fp,$head);
    while(!feof($fp)){
 $line = fread($fp,4096);
 echo $line;
    }
}
?>

接收頁面 test2.php 的代碼為:

';
    print_r($data);
    echo '

'; ?>

3、fsockopen以Socket方式模擬HTTP下載文件

";
    }else{
 // 發送一個HTTP請求信息頭
 $request_header = "GET /aaa.txt";

 // 起始行
 // 頭域 
 $request_header .= "Host: $hostnamen";
 
 // 再一個回車換行表示頭信息結束
 $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 偽造來路

n";
}
else
{
	$end = "rn";
    $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 的代碼為:

';
    print_r($data);
    echo '

'; ?>

可以看到 HTTP_REFERER 的值為 www.kaotop.com,即來路已經偽造成功。

以上就是PHP fsockopen函數詳解的詳細內容,更多請關注考高分網其它相關文章!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM