2012-03-31 7 views
1

Je viens de rencontrer un problème avec mon FAI qui semble refuser de m'autoriser à utiliser fsockopen en me disant que c'est un risque de sécurité et que je dois trouver une alternative suggérant que j'utilise perl.fsockopen équivalent perl

Quelqu'un at-il une alternative à fsockopen en utilisant éventuellement perl pour le script ci-dessous?

<?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, mais je ne vois pas comment passer d'une façon d'ouvrir une socket un autre aidera le "risque de sécurité". – Mat

+0

Ils n'ont aucune idée de ce dont ils parlent ... ou simplement vous donner une raison B.S pour la configuration du serveur existant. –

+3

En y réfléchissant davantage, je suppose que leur administrateur a configuré PHP pour bloquer l'accès au socket sur leur infrastructure d'hébergement - probablement parce qu'ils n'ont pas correctement isolé leur DMZ d'hébergement. L'utilisation d'un autre langage (Perl) qui n'est pas soumis à des limitations configurables sur les sockets est la plupart du temps le conseil d'un employé habitué à contourner ces conditions. –

Répondre

1

On dirait que vous voulez obtenir la réponse du serveur dans $responce sans utiliser des fonctions de prise en PHP. Si shell_exec() est activé par votre fournisseur d'hébergement, vous pouvez exécuter un programme externe pour le faire à la place. Voici un exemple en utilisant 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); 
} 

$> 

Ou vous pouvez utiliser netcat si elles en ont:

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

je vous remercie pour votre réponse, je l'ai essayé et cela a fonctionné parfaitement –