2012-03-31 145 views
1

我剛剛遇到一個問題,我的ISP似乎拒絕讓我使用fsockopen告訴我它的安全風險,我必須找到一個替代方案,建議我使用perl。fsockopen相當於perl

有沒有人有一個替代fsockopen可能使用Perl下面的腳本?

<?php 

// fetches server information from minequery. 
function fetch_server_info($ip, $port){ 
    $socket = fsockopen($ip, $port, $errno, $errstr, 0.5); 

    if($socket === false){ 
     return false; 
    } 

    fwrite($socket, "QUERY_JSON\n"); 

    $responce = stream_get_contents($socket); 

    return json_decode($responce, true); 
} 

?> 
+2

IO ::插座,但我不明白如何從一個方式切換打開一個套接字另一個將有助於「安全風險」。 – Mat 2012-03-31 10:00:40

+0

他們不知道他們在說什麼......或者只是給你一個現有服務器配置的B.S原因。 – 2012-03-31 10:44:36

+3

考慮到這一點,我猜他們的管理員配置了PHP來阻止其託管基礎架構上的套接字訪問 - 可能是因爲他們沒有正確隔離他們的客戶託管DMZ。使用另一種不受可配置套接字限制的語言(Perl),大多數情況下可能是員工習慣繞過這些條件的迴避建議。 – 2012-03-31 12:02:32

回答

1

這聽起來像你想從服務器的響應到$responce沒有在PHP中使用任何的socket函數。如果您的託管服務提供商啓用了shell_exec(),則可以運行外部程序來執行此操作。下面是一個例子用perl:

<?php 

// fetches server information from minequery. 
function fetch_server_info($ip, $port){ 
    $script = <<<'EOF' 
use warnings; 
use strict; 
use IO::Socket; 

die if $#ARGV+1 != 2; 
my $ip = $ARGV[0]; 
my $port = $ARGV[1]; 
my $sock = IO::Socket::INET->new(PeerAddr => "$ip:$port") or die; 
print $sock "QUERY_JSON\n" or die; 
local $/ = undef; 
print <$sock>; 
EOF; 

    $responce = shell_exec("echo '$script' | perl - $ip $port"); 

    if ($responce == NULL) 
     return false; 

    return json_decode($responce, true); 
} 

$> 

或者你可以使用的netcat,如果他們有它:

<?php 

// fetches server information from minequery. 
function fetch_server_info($ip, $port){ 
    $responce = shell_exec("echo QUERY_JSON| nc $ip $port"); 

    if ($responce == NULL) 
     return false; 

    return json_decode($responce, true); 
} 

$> 
+0

謝謝你的回答,我已經試過了,它完美地工作 – 2012-07-01 17:48:05