2012-03-31 114 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