溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關(guān)于PHP中的fsockopen函數(shù)使用方法

發(fā)布時間:2020-03-27 11:29:33 來源:億速云 閱讀:422 作者:小新 欄目:編程語言

今天小編給大家分享的是關(guān)于PHP中的fsockopen函數(shù)使用方法,很多人都不太了解,今天小編為了讓大家更加了解PHP中的fsockopen函數(shù),所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會有所收獲的哦。

關(guān)于PHP中的fsockopen函數(shù)使用方法

PHP fsockopen是一個功能比較強大的函數(shù)。我們在這篇文章中將會對這個函數(shù)做一個具體的介紹,希望對大家有所幫助。記得以前的B2C網(wǎng)站就是通過這個函數(shù)實現(xiàn)前臺和訂單處理系統(tǒng)的交互。

PHP fsockopen函數(shù)說明:

語法:

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這個函數(shù)

PHP fsockopen需要 PHP.ini 中 allow_url_fopen 選項開啟。

allow_url_fopen = On

參數(shù):

hostname:如果安裝了OpenSSL,那么你也許應該在你的主機名地址前面添加訪問協(xié)議ssl://或者是tls://,從而可以使用基于TCP/IP協(xié)議的SSL或者TLS的客戶端連接到遠程主機。

port:端口號。如果對該參數(shù)傳一個-1,則表示不使用端口,例如unix://。

errno:如果errno的返回值為0,而且這個函數(shù)的返回值為 FALSE ,那么這表明該錯誤發(fā)生在套接字連接(connect())調(diào)用之前,導致連接失敗的原因最大的可能是初始化套接字的時候發(fā)生了錯誤。

errstr:錯誤信息將以字符串的信息返回。

timeout:設置連接的時限,單位為秒。

返回值:

fsockopen() 將返回一個文件句柄,之后可以被其他文件類函數(shù)調(diào)用(例如: fgets() , fgetss() , fwrite() , fclose() 還有 feof() )。如果調(diào)用失敗,將返回 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);
    }
?>

運行結(jié)果:

關(guān)于PHP中的fsockopen函數(shù)使用方法

2、PHP fsockopen模擬POST/GET方法

fsockopen除了像上面實例模擬生成 HTTP 連接之外,還能實現(xiàn)很多功能,比如模擬post 和 get 傳送數(shù)據(jù)的方法。
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()函數(shù)的作用是使用給出的關(guān)聯(lián)(或下標)數(shù)組生成一個經(jīng)過 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協(xié)議傳輸文件
        *   Http是應用層協(xié)議使用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{
        // 發(fā)送一個HTTP請求信息頭
        $request_header = "GET /aaa.txt";

        // 起始行
        // 頭域 
        $request_header .= "Host: $hostname\n";
        
        // 再一個回車換行表示頭信息結(jié)束
        $request_header .= "\n";

        // 發(fā)送請求到服務器
        fputs($fp,$request_header);

        // 接受響應
        $fp2 = fopen('aaa.txt','w');

        while(!feof($fp)){
            $line = fputs($fp2,fgets($fp,128));
            echo $line;
        }

        // 關(guān)閉
        fclose($fp2);
        fclose($fp);
    }
?>

執(zhí)行程序,你會發(fā)現(xiàn)在這個程序文件的同級目錄就會出現(xiàn)那個你需要下載的文件了。

這實質(zhì)上是 Socket 模擬HTTP協(xié)議傳輸文件。同時還要注意一下 PHP 的超時限制,這里設置我 PHP 服務器超時為無限才能正確下載,否則可能下載不全 PHP 程序就停止了。

注意:

bool stream_set_blocking ( resource $stream , int $mode )

為 stream 設置阻塞或者阻塞模。

此函數(shù)適用于支持非阻塞模式的任何資源流(常規(guī)文件,套接字資源流等)。

參數(shù)

stream:資源流。

mode:如果 mode 為0,資源流將會被轉(zhuǎn)換為非阻塞模式;如果是1,資源流將會被轉(zhuǎn)換為阻塞模式。 該參數(shù)的設置將會影響到像 fgets() 和 fread() 這樣的函數(shù)從資源流里讀取數(shù)據(jù)。 在非阻塞模式下,調(diào)用 fgets() 總是會立即返回;而在阻塞模式下,將會一直等到從資源流里面獲取到數(shù)據(jù)才能返回。

返回值

成功時返回 TRUE, 或者在失敗時返回 FALSE。

4、使用 fsockopen 偽造來路

<?php
$host = "127.0.0.1"; //你要訪問的域名
$ip = '127.0.0.1';
$target = "/test2.php"; //你要訪問的頁面地址
$referer = "http://www.kemok4.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.kemok4.com/,即來路已經(jīng)偽造成功。

關(guān)于關(guān)于PHP中的fsockopen函數(shù)使用方法就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內(nèi)容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI