fsockopen() — Open Internet or Unix domain socket connection php
1、如何禁用fsockopen()
下面是兩種經常使用的禁用fsockopen的方法。
一、修改php.ini,將 disable_functions = 後加入 fsockopen
二、修改php.ini,將 allow_url_fopen = On 改成 allow_url_fopen = Off 安全
2、如何解決fsockopen函數被禁用
一、若是服務器沒有同時禁用pfsockopen,那麼直接將fsockopen函數替換爲pfsockopen。
具體操做:搜索程序中的字符串 fsockopen( 替換爲 pfsockopen(。示例以下
修改前:
$fp = fsockopen($host, 80, $errno, $errstr, 30); 服務器
修改後:
$fp = pfsockopen($host, 80, $errno, $errstr, 30);
二、若是服務器同時禁用了pfsockopen,那麼用其餘函數代替,如stream_socket_client()。
注意:stream_socket_client()和fsockopen()的參數不一樣。
具體操做:搜索程序中的字符串 fsockopen( 替換爲 stream_socket_client(,而後,將原fsockopen函數中的端口參數「80」刪掉,並加到$host。示例以下
修改前:
$fp = fsockopen($host, 80, $errno, $errstr, 30); 網絡
修改後
$fp = stream_socket_client($host."80", $errno, $errstr, 30);
三、若是PHP版本低於5.0,fsockopen被禁用,又沒有stream_socket_client()怎麼辦呢?本身寫一個函數實現fsockopen的功能,參考代碼:
function b_fsockopen($host, $port, &$errno, &$errstr, $timeout) {
$ip = gethostbyname($host);
$s = socket_create(AF_INET, SOCK_STREAM, 0);
if (socket_set_nonblock($s)) {
$r = @socket_connect($s, $ip, $port);
if ($r || socket_last_error() == EINPROGRESS) {
$errno = EINPROGRESS;
return $s;
}
}
$errno = socket_last_error($s);
$errstr = socket_strerror($errno);
socket_close($s);
return false;
} dom
具體操做:
1.首先找到使用fsockopen函數的代碼段,將上面代碼加至其上端,搜索該代碼段中的字符串fsockopen( 替換爲 b_fsockopen(。
2.由於fsockopen函數返回文件指針因此能夠被文件函數操做,可是這個b_fsockopen函數沒能返回文件指針,須要繼續修改代碼段:用socket_read(替換掉 fread(,用socket_write(替換掉fwrite(,用socket_close(替換掉fclose(。 socket