2012-03-31 2 views
1

방금 ​​ISP에 문제가 생겨서 fsockopen에 보안 위험을 말하면서 perl을 사용하는 대안을 찾아야 만합니다.fsockopen 해당 perl

누구나 fsockopen 대신 아래 스크립트에 perl을 사용할 수 있습니까? 당신이 PHP의 소켓 함수를 사용하지 않고 $responce에 서버의 응답을 얻으려면 같은

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

+0

그들은 그들이 무엇에 관해서 이야기하고 있는지 또는 단지 기존 서버 구성에 대한 B.S 이유를 알려주지 못합니다. –

+3

이것에 대해 더 생각해 보면 관리자가 호스팅 인프라에서 소켓 액세스를 차단하도록 PHP를 구성했다고 추측 할 수 있습니다. 고객 호스팅 DMZ를 제대로 분리하지 않았기 때문일 수 있습니다. 소켓에 구성 가능한 제한이없는 다른 언어 (Perl)를 사용하는 것은 대부분 이러한 조건을 극복하는 데 익숙한 직원의 백핸드 조언 일 가능성이 큽니다. –

답변

1

는 소리가 난다. 호스팅 제공 업체에서 shell_exec()를 활성화 한 경우 외부 프로그램을 실행하여 대신이 작업을 수행 할 수 있습니다. 여기에 예를 사용하여 펄의 :

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

답장을 보내 주셔서 감사합니다. 시험해 보았습니다. 완벽하게 작동했습니다. –