SMTP发送邮件不不荒谬的化解措施,v9代码解读

phpcms V9
会员大旨出现不可能登入的状态,查明原因开采是服务器禁止使用了fsockopen函数导致的。上面是消除方案!

一:近年来黑客利用程序漏洞注入后选用 fsockopen 举办PHPDDOS
攻击,导致有的服务器动荡,今后将危急函数 fsockopen
如今禁止使用,部分程序功效恐怕有标题,以下列出已知难题及通用消除办法:

一、数据库加载:
数据库配置文件:安装时填写的数据库配置数据存款和储蓄在caches/configs/database.php

PHPCMS V9 fsockopen 禁止使用消除方案, 把fsockopen 替换到 pfsockopen 
轮换文件:
phpsso_server/api/uc_client_1_5/client.php
phpsso_server/api/uc_client_1_5/lib/sendmail.inc.php
phpsso_server/api/uc_client_1_5/model/misc.php
phpsso_server/api/uc_client/lib/sendmail.inc.php
phpsso_server/phpcms/modules/admin/functions/global.func.php
phpsso_server/phpcms/libs/classes/http.class.php
phpcms/modules/admin/functions/global.func.php
phpcms/modules/search/search_admin.php
phpcms/modules/search/classes/sphinxapi.class.php (两个)
phpcms/modules/pay/classes/pay_abstract.class.php
phpcms/modules/sms/classes/smsapi.class.php
phpcms/modules/member/classes/client.class.php   (会员注册)
phpcms/libs/classes/http.class.php
phpcms/libs/functions/mail.func.php 

通用解决方法: 找到程序里的 fsockopen
函数,替换为:pfsockopen,就可以缓慢解决全数标题,三个函数的区分在于
pfsockopen 保持 keep-alive,使得黑客不能进展 连接数攻击。
已知使用 fsockopen 函数的顺序文件路线(在fsockopen 前加 p, 即fsockopen
修改为 pfsockopen 就能够 )

(1)index.php入库文件,并加载phpcms/base.php。
(2)index.php文件:pc_base::creat_app();
(3)phpcms/libs/classes/application.class.php:$controller =
$this->load_controller();
暗中同意加载:phpcms\modules\content\index.php
(4)phpcms\modules\content\index.php:$this->db =
pc_base::load_model(‘content_model’);
加载文件:phpcms/model/content_model.class.php
(5)phpcms/model/content_model.class.php:$this->db_config =
pc_base::load_config(‘database’);
(6)加载配置文件:caches/configs/database.php

版权注明:本文为博主原创小说,未经博主允许不得转发。

二:服务器同不时候禁止使用了fsockopen
pfsockopen,那么用其它函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数差别。
具体操作:
探求程序中的字符串 fsockopen( 替换为 stream_socket_client(
,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。
演示如下

二、模板深入分析:
文件:phpcms/libs/functions/global.func.php
调用:include template($module,$template);


修改前:

模板缓存文件:phpcms/libs/classes/template_cache.class.php
template_compile:模板编写翻译函数

$fp = fsockopen($host, 80, $errno, $errstr, 30);

—————————— edit in 2011-05-07

三、用户登入模块(phpsso关联)
1、phpcms/modules/member/index.php
登入操作:login()

$status = $this->client->ps_member_login($username,
$password);//phpsso中决断用户登录,准确重返用户数据array
…//若是本地用户新闻不存在,则插入数据,保持数据一致。

$synloginstr =
$this->client->ps_member_synlogin($r[‘phpssouid’]);//phpsso用户同步登录函数
//==========别的分析至[phpsso通信]==========

四、用户注册模块(phpsso关联)
1、phpcms/modules/member/index.php
挂号操作:register()
$this->_session_start();//加载phpcms/libs/classes/session_mysql.class.php

$member_setting = getcache(‘member_setting’);//加载用户配置

$siteid = isset($_REQUEST[‘siteid’]) && trim($_REQUEST[‘siteid’])
? intval($_REQUEST[‘siteid’]) : 1;//默认siteid为1

$this->_init_phpsso();//加载phpcms/modules/member/classes/client.class.php
//phpcms/base.php中load_app_class()函数的defined(“ROUTE_M”)来至于phpcms/libs/classes/application.class.php

$status =
$this->client->ps_member_register($userinfo[‘username’],
$userinfo[‘password’], $userinfo[’email’], $userinfo[‘regip’],
$userinfo[‘encrypt’]);//phpsso中增加注册用户,再次来到phpssouid

$userid = $this->db->insert($userinfo,
1);//本地用户数据增加。密码加密存款和储蓄

五、后台部分整理
1、口令卡(移除)
布署文件:caches/configs/system.php

后台登入/退出:phpcms/modules/admin/index.php
后台管理:phpcms/modules/admin/admin_manage.php

口令卡类:phpcms/modules/admin/classes/card.class.php
助理馆员类:phpcms/modules/admin/classes/admin.class.php

言语文件:phpcms/languages/zh-cn/admin.lang.php
phpcms/languages/zh-cn/system_menu.lang.php

模板文件:phpcms/modules/admin/templates/admin_list.tpl.php
phpcms/modules/admin/templates/login_card.tpl.php
phpcms/modules/admin/templates/admin_card.tpl.php

2、后台登入
phpcms/modules/admin/classes/admin.class.php
平常下加载phpcms/libs/classes/session_mysql.class.php
…session_start();//开启session

phpcms/modules/admin/classes/admin.class.php
情状判别:check_admin()

phpcms/modules/admin/index.php
登录操作:login()

$_SESSION[‘userid’] = $r[‘userid’];

$cookie_time = SYS_TIME+86400*30;

param::set_cookie(‘userid’, $r[‘userid’],$cookie_time);

//设置session和cookie

六、phpsso通讯机制
1、用户登入/注册模块中调用phpcms/modules/member/classes/client.class.php
private function _ps_send(){//调用phpsso接口地址
return
$this->_ps_post($this->ps_api_url.”/index.php?m=phpsso&c=index&a=”.$action,500000,$this->auth_data($data));//socket格局交给post数据
}

修改后:

—————————— edit in 2011-05-11

private function _get_url() {
$sys_protocal = isset($_SERVER[‘SERVER_PORT’]) &&
$_SERVER[‘SERVER_PORT’] == ‘443’ ? ‘https://’ : ‘http://’;
$php_self = $_SERVER[‘PHP_SELF’] ?
$this->_safe_replace($_SERVER[‘PHP_SELF’]) :
$this->_safe_replace($_SERVER[‘SCRIPT_NAME’]);
$path_info = isset($_SERVER[‘PATH_INFO’]) ?
$this->_safe_replace($_SERVER[‘PATH_INFO’]) : ”;
$relate_url = isset($_SERVER[‘REQUEST_URI’]) ?
$this->_safe_replace($_SERVER[‘REQUEST_URI’]) :
$php_self.(isset($_SERVER[‘QUERY_STRING’]) ?
‘?’.$this->_safe_replace($_SERVER[‘QUERY_STRING’]) :
$path_info);
return $sys_protocal.(isset($_SERVER[‘HTTP_HOST’]) ?
$_SERVER[‘HTTP_HOST’] : ”).$relate_url;
}

private function _ps_post($url, $limit = 0, $post = ”, $cookie = ”,
$ip = ”, $timeout = 15, $block = true) {
$return = ”;
$matches = parse_url($url);//解析URL
$host = $matches[‘host’];//主机名
$path = $matches[‘path’] ? $matches[‘path’].($matches[‘query’] ?
‘?’.$matches[‘query’] : ”) : ‘/’;//路线及查询字符串
$port = !empty($matches[‘port’]) ? $matches[‘port’] : 80;//端口
$siteurl = $this->_get_url();//获取当前页面完整U大切诺基L地址
if($post) {//post格局提交
$out = “POST $path HTTP/1.1\r\n”;
$out .= “Accept: **\r\n”;
$out .= “Referer: “.$siteurl.”\r\n”;
$out .= “Accept-Language: zh-cn\r\n”;
$out .= “User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n”;
$out .= “Host: $host\r\n”;
$out .= “Connection: Close\r\n”;
$out .= “Cookie: $cookie\r\n\r\n”;
}
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr,
$timeout);//用socket格局张开三个文本指针
if(!$fp) return ”;

stream_set_blocking($fp, $block);//设置阻塞方式
stream_set_timeout($fp, $timeout);//设置连接时间
@fwrite($fp, $out);//把多少写入文件指针中,即发送恳求头音信
$status =
stream_get_meta_data($fp);//从包装协议文件指针中拿走报头/元数据,即重返写入的连锁情形

if($status[‘timed_out’]) return ”; //等待数据流超时
while (!feof($fp))
{//循环读取响应头消息,直到文件指针到达文件截至的职位
if(($header = @fgets($fp)) && ($header == “\r\n” || $header == “\n”))
break;//从文件指针中读取一行
}

$stop = false;
while(!feof($fp) && !$stop) {//调控是或不是读取完结
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$return .= $data;
if($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
@fclose($fp);//关闭七个已开荒的文件指针

//部分虚拟主机再次回到数值有误,暂不鲜明原因,过滤重临数据格式
$return_arr = explode(“\n”, $return);
if(isset($return_arr[1])) {
$return = trim($return_arr[1]);
}
unset($return_arr);

return $return;
}
七、php-socket相关
1、创建流:fopen()、fsockopen()、pfsockopen()
2、stream_set_blocking($resource,$flag)
$flag:0非阻塞,1阻塞
某些函数读取三个互连网流,当未有未读取字节时:
闭塞:一贯守候,直到下叁个未读取的字节出现。
非阻塞:立即告诉调用者当前并没有新剧情。
闭塞的裨益是,排除别的非不奇怪因素,阻塞的是按梯次实施的一齐的读取。
3、stream_set_timeout($resource,$responseTimeout)//设置重回的过期时间
4、stream_get_meta_data($resource)
//从包装协议文本指针中赢得报头/元数据
(1)timed_out (bool) – 假如在上次调用 fread() 或然 fgets()
中等待数据时流超时了则为 TRUE。
(2)blocked (bool) – 要是流处于阻塞 IO 形式时为 TRUE。参见
stream_set_blocking()。
(3)eof (bool) – 如若流到达文件末尾时为 TRUE。注意对于 socket 流乃至当
unread_bytes 为非零值时也足认为 TRUE。要测定是不是有越来越许多据可读,用
feof()代替读取本项指标值。
(4)unread_bytes (int) – 当前在 PHP 本人的内部缓冲区中的字节数。
5、stream_get_contents($resource)//取得重回的数据流内容
6、相关函数:fwrite()、fgets()、feof()、fread()、fclose()
读字符串函数fgets函数的效应是从内定的文件中读三个字符串到字符数组中,函数调用的情势为:
fgets(字符数组名,n,文件指针);当中的n是三个正整数。表示从文件中读出的字符串不超过n-1个字符。在读入的末尾多个字符后增加串甘休标记’\0’。举例:fgets(str,n,fp);的含义是从fp所指的文本中读出n-1个字符送入字符数组str中。
fread是用以整块数据的读写函数,可用来读写一组数据,如二个数组成分,贰个构造变量的值等。读数据块函数调用的貌似情势为:
fread(buffer,size,count,fp),当中buffer是二个指南针,在fread函数中,它意味着存放输入数据的首地址。
size 表示数据块的字节数。count 代表要读写的数目块块数。fp
表示文件指针。
eg:fread(fa,4,5,fp);
其含义是从fp所指的公文中,每趟读4个字节(三个实数)送入实数组fa中,延续读5次,即读5个实数到fa中。
7、$_POST、HTTP_RAW_POST_DATA、php://input
(1)HTTP_RAW_POST_DATA仅在境遇未识别MIME类型的数据时发出。对于enctype=”multipart/form-data”表单数据不可用。
(2)访问原始POST数据的越来越好点子是php://input
(3)php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA
比起来,它给内部存款和储蓄器带来的压力一点都不大,并且没有须求别的例外的 php.ini
设置。php://input 不能够用来 enctype=”multipart/form-data”。

基本上$GLOBALS[‘HTTP_RAW_POST_DATA’] 和
$_POST是完全一样的。但是只要post过来的数目不是PHP能够识其余,你能够用
$GLOBALS[‘HTTP_RAW_POST_DATA’]来接收,比如text/xml或者soap等等。

PHP暗许知其余数据类型是application/x-www.form-urlencoded标准的数据类型
故而,对型如text/xml的内容无法剖判为$_POST数组,故保留原型,交给$GLOBALS[‘HTTP_RAW_POST_DATA’]
来接收。
eg.
(1)phpcmsv9中phpsso_server/phpcms/modules/phpsso/classes/phpsso.class.php
if(isset($GLOBALS[‘HTTP_RAW_POST_DATA’])){
$this->data[‘avatardata’] = $GLOBALS[‘HTTP_RAW_POST_DATA’];

}
(2)phpsso_server/phpcms/modules/phpsso/index.php
file_put_contents($filename,$this->data[‘avatardata’]);//把数据写入文件
eg.
<form action=”test.php” method=”post”>
<input type=”text” name=”user”>
<input type=”password” name=”password”>
<input type=”submit”>
</form>
test.php
<? echo file_get_contents(“php://input”); ?>
八、http协议
1、特点
简易快速:客户向服务器央浼服务时,只需传送诉求方法和渠道。伏乞方法常用的有GET、HEAD、POST。
利落:HTTP允许传输自便档期的顺序的数据对象。正在传输的等级次序由Content-Type加以标志。
无连接:无连接的意义是限制每回再而三只管理三个呼吁。服务器管理完客户的须要,并收到客户的答问后,即断开连接。选择这种办法得以节约传输时间。
无状态:HTTP协议是无状态协议。无状态是指协议对于事务管理未有纪念本领。缺乏状态意味着假若继续管理需求前边的音信,则它必须重传,那样可能引致每便一而再传送的数据量增大。另一方面,在服务器不必要先前音信时它的回应就相当慢。
2、php-socket中http的央求和响应
========== 央求头音讯 ==========
Host:localhost
User-Agent:Mozilla/5.0
(Windows NT 5.1; rv:2.0)
Gecko/20100101 Firefox/4.0
Accept:application/json, text/javascript, */*
Accept-Language:zh-cn,zh;q=0.5
Accept-Encoding:gzip, deflate
Accept-Charset:GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:115
Proxy-Connection:keep-alive
Content-Type:application/x-www-form-urlencoded
X-Requested-With:XMLHttpRequest
Referer:
Cookie:—cookie相关—
—诉求发送数据—
========== 响应头音信 ==========
Proxy-Connection:Keep-Alive
Connection:Keep-Alive
Content-Length:112
Via 1.1 WALKISA
Date:Tue, 17 May 2011 03:26:18 GMT
Content-Type:text/html; charset=gbk
Server:nginx/0.7.67
X-Powered-By:PHP/5.2.13

$fp = stream_socket_client($host.”80″, $errno, $errstr, 30);
国内主流PHP网址涉及fsockopen函数的网址连串中的文件列表:
境内主流PHP网址涉及fsockopen函数的网址系统中的文件列表:

—————————— edit in 2011-05-18


DEDECMS:
 

复制代码 代码如下:

source\function\function_core.php 
那个文件有2处fsockopen,别的的是pfsockopen,请小心区分
uc_client\client.php 
那几个文件有2处fsockopen,其它的是pfsockopen,请留心区分
uc_client\lib\sendmail.inc.php
uc_client\model\misc.php
这么些文件有2处fsockopen,其它的是pfsockopen,请留意区分
uc_server\install\func.inc.php
那些文件有2处fsockopen,别的的是pfsockopen,请留意区分
uc_server\lib\sendmail.inc.php
uc_server\model\misc.php
那一个文件有2处fsockopen,此外的是pfsockopen,请小心区分

Discuz! 2.5:

复制代码 代码如下:

source\function\function_core.php 
这些文件有2处fsockopen,此外的是pfsockopen,请留意区分
uc_client\client.php 
那几个文件有2处fsockopen,其它的是pfsockopen,请小心区分
uc_client\lib\sendmail.inc.php
uc_client\model\misc.php
这么些文件有2处fsockopen,别的的是pfsockopen,请小心区分
uc_server\install\func.inc.php
那么些文件有2处fsockopen,其它的是pfsockopen,请留心区分
uc_server\lib\sendmail.inc.php
uc_server\model\misc.php
那个文件有2处fsockopen,此外的是pfsockopen,请留意区分

ecms(帝国):

e\class\class.smtp.php
 
ECSHOP:

复制代码 代码如下:

admin\index.php
demo\includes\lib_updater.php
includes\cls_smtp.php
includes\cls_transport.php
includes\lib_base.php
includes\modules\payment\paypal.php

 
shopex:
 

复制代码 代码如下:

core\api\include\api_utility.php
core\api\tools\1.0\api_b2b_1_0_tools.php
core\func_ext.php
core\lib\nusoap.php
core\lib\uc_client\client.php
instal\svinfo.php
plugins\passport\passport.ucenter.php
plugins\payment\pay.nochek.php
plugins\pay.paypal.php
plugins\pay.paypal.server.php
plugins\pay.paypal_cn.php

您也许感兴趣的小说:

  • PHP的fsockopen、pfsockopen函数被主机商禁止使用的消除办法

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注