fsockopen等效的perl

时间:2012-03-31 09:56:58

标签: php perl

我刚刚遇到一个问题,我的ISP似乎拒绝让我使用fsockopen告诉我它存在安全风险,而且我必须找到一个替代方案,建议我使用perl。

有没有人可以使用perl作为fsockopen替代下面的脚本?

<?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);
}

?>

1 个答案:

答案 0 :(得分:1)

听起来您希望在不使用PHP中的任何套接字函数的情况下将服务器的响应发送到$responce。如果托管服务提供商启用了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);
}

$>