2012-03-31 5 views
1

Ich habe gerade ein Problem mit meinem ISP, die es scheint, verweigert mir zu erlauben, fsockopen mir ein Sicherheitsrisiko zu nennen und ich muss eine Alternative finden, die darauf hindeutet, dass ich Perl verwende.fsockopen Äquivalent perl

Hat jemand eine Alternative zu fsockopen möglicherweise mit Perl für das Skript unten?

<?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 :: Socket, aber ich sehe nicht, wie von einer Art und Weise Schalten einer Steckdose zu öffnen ein anderer wird dem "Sicherheitsrisiko" helfen. – Mat

+0

Sie haben keine Ahnung, wovon sie reden ... oder nur einen Grund für die existierende Serverkonfiguration geben. –

+3

Wenn ich darüber nachdenke, würde ich vermuten, dass ihr Admin PHP konfiguriert hat, um den Socket-Zugriff auf ihre Hosting-Infrastruktur zu blockieren - wahrscheinlich, weil sie ihre DMZ-Kunden-Hosting nicht ordnungsgemäß isoliert haben. Die Verwendung einer anderen Sprache (Perl), die keinen konfigurierbaren Beschränkungen für Sockets unterliegt, ist höchstwahrscheinlich der Backhanded-Rat eines Mitarbeiters, der verwendet wird, um diese Bedingungen zu umgehen. –

Antwort

1

Es klingt wie Sie die Antwort vom Server in $responce ohne Verwendung eines der Socket-Funktionen in PHP bekommen möchten. Wenn shell_exec() von Ihrem Hosting-Provider aktiviert wird, können Sie stattdessen ein externes Programm ausführen. Hier ist ein Beispiel unter Verwendung von 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); 
} 

$> 

Oder Sie könnten netcat verwenden, wenn sie es haben:

<?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

danke für deine antwort, ich habe es ausprobiert und es hat perfekt funktioniert –