
php抓取网页数据插入数据库
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
网站优化 • 优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-05-26 15:40
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS 查看全部
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
网站优化 • 优采云 发表了文章 • 0 个评论 • 83 次浏览 • 2022-05-20 18:48
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS 查看全部
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS
php抓取网页数据插入数据库phpbootstrap设计的思路很简单
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-05-16 03:12
php抓取网页数据插入数据库
phpbootstrap设计发布,用户量剧增。开始尝试做企业级服务器的设计,当时由于项目需要,对于服务器的设计和部署相当专业。后来项目停止了,开始做android,然后nodejs,后来是java。今年拿到pmc权限。在调研了大量方案后,做了个3.0版本,基于php的web服务器。服务器设计思路很简单,如下:针对java程序员和web程序员,有两种方案。
设计一个简单的phprpc通讯服务,同时服务端程序,监听socket的成功和失败,传递需要请求的参数到后端,然后调用后端的一个程序,执行请求。同时程序员监听服务端响应结果,通过ajax方式返回结果给后端。后端会把这个消息封装成一个model方法,也就是调用后端的api。后端同样把后面请求消息封装成一个model方法,这样不用动改原有的数据结构,只需要修改后端的api。
比如原来c端的就是`.json`方法返回数据,现在是`.json`,.json`就是请求参数,现在是`json`,.json`就是响应结果。这样就能避免设计这种两层php的问题,后端只需要把请求参数参数丢到后端即可。另外,web程序员主要是前端页面设计,后端程序员主要是后端封装方法,本地调用后端程序。
这样一来,可以利用php的cli自动化部署,或者自己手动编程。不过还是建议用一个phpaptana包,可以帮助更好的aptana简化过程,顺带可以切换成本地环境。 查看全部
php抓取网页数据插入数据库phpbootstrap设计的思路很简单
php抓取网页数据插入数据库
phpbootstrap设计发布,用户量剧增。开始尝试做企业级服务器的设计,当时由于项目需要,对于服务器的设计和部署相当专业。后来项目停止了,开始做android,然后nodejs,后来是java。今年拿到pmc权限。在调研了大量方案后,做了个3.0版本,基于php的web服务器。服务器设计思路很简单,如下:针对java程序员和web程序员,有两种方案。
设计一个简单的phprpc通讯服务,同时服务端程序,监听socket的成功和失败,传递需要请求的参数到后端,然后调用后端的一个程序,执行请求。同时程序员监听服务端响应结果,通过ajax方式返回结果给后端。后端会把这个消息封装成一个model方法,也就是调用后端的api。后端同样把后面请求消息封装成一个model方法,这样不用动改原有的数据结构,只需要修改后端的api。
比如原来c端的就是`.json`方法返回数据,现在是`.json`,.json`就是请求参数,现在是`json`,.json`就是响应结果。这样就能避免设计这种两层php的问题,后端只需要把请求参数参数丢到后端即可。另外,web程序员主要是前端页面设计,后端程序员主要是后端封装方法,本地调用后端程序。
这样一来,可以利用php的cli自动化部署,或者自己手动编程。不过还是建议用一个phpaptana包,可以帮助更好的aptana简化过程,顺带可以切换成本地环境。
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-05-14 02:24
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS 查看全部
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS
php抓取网页数据插入数据库设置登录密码;抓取任意页面点击设置密码
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-05-11 08:02
php抓取网页数据插入数据库设置登录密码;网页抓取任意页面点击设置密码;网页抓取php代码设置---php文件头部加入password;根据你的php版本不同,可能网页抓取有自己的函数参数或是约定俗成的函数参数,可以手动输入或者在我的计算机里,php-h中对应的payload或者直接写进自己的php文件;获取保存网页地址,这个可以通过直接random或随机数获取保存;整个过程基本就是单纯的爬取和保存,对于新手来说还是不易实现!实现这个爬取方法相对比较简单!index.php是爬取网页文章的脚本,random的获取规则是:如果内容需要在页面当中传输,必须在爬取这个页面时设置保存,并且要设置保存位置。再php中,用pwd-d判断加密!后面的一些步骤自己在练习当中实现一下即可!。
java服务器里面封装了一个apache的postmessage类,
做php爬虫应该从http协议看起,里面可以总结出很多的姿势。不过我做php爬虫应该从php文件看起吧。
打printstatus函数,同时设置一个定时器。一直监听着。这样所有请求的回应header都有:requestheader="get"timeout=45suser-agent="mozilla/5.0(windowsnt6.1;win64;x64)applewebkit/537.36(khtml,likegecko)chrome/69.0.2480.110safari/537.36"format="postmessage"参数就是你要发送给php接口的php文件所在位置。
你点下相应的文件,就可以看到其网址。在模拟器里面可以用node-script。看看nodejs你是否用过,还是只用过php做爬虫。 查看全部
php抓取网页数据插入数据库设置登录密码;抓取任意页面点击设置密码
php抓取网页数据插入数据库设置登录密码;网页抓取任意页面点击设置密码;网页抓取php代码设置---php文件头部加入password;根据你的php版本不同,可能网页抓取有自己的函数参数或是约定俗成的函数参数,可以手动输入或者在我的计算机里,php-h中对应的payload或者直接写进自己的php文件;获取保存网页地址,这个可以通过直接random或随机数获取保存;整个过程基本就是单纯的爬取和保存,对于新手来说还是不易实现!实现这个爬取方法相对比较简单!index.php是爬取网页文章的脚本,random的获取规则是:如果内容需要在页面当中传输,必须在爬取这个页面时设置保存,并且要设置保存位置。再php中,用pwd-d判断加密!后面的一些步骤自己在练习当中实现一下即可!。
java服务器里面封装了一个apache的postmessage类,
做php爬虫应该从http协议看起,里面可以总结出很多的姿势。不过我做php爬虫应该从php文件看起吧。
打printstatus函数,同时设置一个定时器。一直监听着。这样所有请求的回应header都有:requestheader="get"timeout=45suser-agent="mozilla/5.0(windowsnt6.1;win64;x64)applewebkit/537.36(khtml,likegecko)chrome/69.0.2480.110safari/537.36"format="postmessage"参数就是你要发送给php接口的php文件所在位置。
你点下相应的文件,就可以看到其网址。在模拟器里面可以用node-script。看看nodejs你是否用过,还是只用过php做爬虫。
php抓取网页数据插入数据库(PM需遵守的数据库设计与创建规范)
网站优化 • 优采云 发表了文章 • 0 个评论 • 37 次浏览 • 2022-04-19 15:47
1.一般
为规范公司各种环境下数据库系统的设计和创建过程,提高数据库系统的开发效率,保证数据库系统的性能和安全稳定运行,特制定本规范。
该规范涉及 PM、RD、SQ 和 DBA 四个角色。数据库系统设计和创建过程中各个角色的工作内容会按照【高风险】、【强制】、【推荐】三个级别进行标注,按照优先级从高到低。
对于不符合【高风险】和【强制】两个级别的工作内容,DBA将强制其回电并要求修改。
2.适用范围
本规范定义的数据库系统包括部署在传统数据中心(物理机如Cisco UCS)和云(公有云、私有云)中的所有数据库实例。相关数据库实例参考数据库开发和创建的相关规范。
3.PM 应遵循的数据库设计和创建规范
本规范旨在帮助或指导 RD、QA、OP 等技术人员设计和开发适合在线业务的数据库。规范数据库变更及处理流程、数据库表设计、SQL编写等,为公司业务系统稳定健康运行提供保障。
3.1 Mysql设计开发规范
MySQL数据库与Oracle、SQL Server等商业数据库相比,在内核上各有优劣。我们在使用MySQL数据库进行设计开发时,需要遵循一定的规范,扬长避短。
3.1.1 命名约定
数据库对象命名规则的范围是管理平台设计和开发中涉及的表。由其他外部系统创建的表不在本规范的范围内。
表、列、序列、过程、函数等数据库对象应按照以下规则命名:
【强制】名称必须使用有意义的中英文缩写,以字母开头,不能超过32个字符。
【强制】名称必须使用小写字母,
【必选】数据库对象名由以下部分组成:范围、类型、名称实体,下划线“_”用于连接各个单词。
【必填】各个数据库对象的范围和类型的具体含义和取值,请参考各个数据库对象的命名规则。
数据库对象命名规则
【强制】数据库对象的名称不允许是数据库的保留字和关键字。
SELECT id, name, from, age FROM user not allowed
请参阅保留字和关键字的链接
选项/变量参考3.1.2 库规范
【强制】创建数据库时必须明确指定字符集,字符集只能是utf8或utf8mb4。创建数据库 SQL 示例:
创建数据库 db1 默认字符集 utf8;
3.1.3 表结构规范
【强制】创建表时,必须明确指定字符集为utf8或utf8mb4。
【强制】创建表时,必须显式指定表存储引擎类型。如果没有特殊要求,永远都是 InnoDB。当需要使用 InnoDB 以外的存储引擎时,必须经过 DBA 的审核才能在生产环境中使用。因为Innodb表支持事务、行锁、崩溃恢复、MVCC等关系型数据库的重要特性,所以是业界使用最多的MySQL存储引擎。这是大多数其他存储引擎所不具备的,因此 InnoDB 是首选。
【强制】表格必须有注释,数据字典必须从一开始就维护。类状态类型需要指定主值的含义,如“0-离线,1-在线”
【强制】中间表用于存放中间结果集,名称必须以tmp_开头。备份表用于备份或拍摄源表的快照,名称必须以 bak_ 开头。定期清理中间表和备份表。
【强制】对于超过100W行的大表,alter table必须经过DBA审核,并在业务低峰期执行。因为alter table会产生表锁,在此期间阻塞所有对表的写可能对业务有很大的影响。
【建议】关于建表时的主键:(1)强制主键为id,类型为int或bigint,为auto_increment;(2)标识的字段表中每一行的主题不应该设置为主键,建议设置其他字段如user_id、order_id等,并建立唯一键索引。因为如果设置为主键和主键值随机插入,会导致innodb内部分页和大量随机I/O,性能下降。
【建议】核心表(如用户表、钱相关表)必须要有行数据的创建时间字段create_time和最后更新时间字段update_time,方便排查问题。
【建议】建议将表中的blob、text等大字段垂直拆分到其他表中,仅在需要读取这些对象时才选择。
【建议】反范式设计:经常需要join查询的字段的冗余副本放在其他表中。比如user_account、user_login_log等表中user_name属性是多余的,减少了join查询。
3.1.4 字段说明
【建议】表中所有字段必须为NOT NULL属性,商家可根据需要定义DEFAULT值。因为使用NULL值会导致每行额外存储空间、容易出错的数据迁移、聚合函数计算结果偏差等问题。如果不保证插入时一定有值,定义时使用默认值''或0。
使用 NUMBER 类型时,必须指定长度。准确度和密度取自NUMBER,保证数据一致性
表中字段的命名长度不应超过 30 个字节
【推荐】表中自增列(auto_increment属性)推荐使用bigint类型。因为unsigned int的存储范围是-2147483648~2147483647(约21亿),溢出后会报错。
【推荐】对于业务中选择性较少的状态、类型等字段,建议使用tinytint或smallint,以节省存储空间。
【建议】业务中IP地址字段建议使用int类型,不建议使用char(15)。因为int只占4个字节,可以使用以下函数相互转换, 而 char(15) 至少占用 15 个字节。一旦表数据行数达到 1 亿,就需要使用更多的 1.1G 存储空间。
SQL: 选择 inet_aton('192.168.2.12'); 选择 inet_ntoa(3232236044);
PHP: ip2long('192.168.2.12'); long2ip(3530427185);
【推荐】不推荐使用enum和set。因为它们浪费空间,而且枚举值是硬编码的,不方便更改。建议使用 Tinyint 或 smallint。
【推荐】不推荐blob、text等类型。它们都浪费硬盘和内存空间。加载表数据时,会将大字段读入内存,浪费内存空间,影响系统性能。是否真的需要这么大的字段,建议与PM和RD沟通。在 Innodb 中,当一行记录超过 8098 字节时,将选择记录中最长的字段,并将其中的 768 字节放在原创页中,其余字段将放在溢出页中。不幸的是,在紧凑行格式中,原创页面和溢出页面都被加载了。
【建议】存钱的字段,推荐使用int,终端乘以100除以100访问。因为 int 占用 4 个字节,double 占用 8 个字节,所以浪费空间。
【建议】尽量使用varchar存储文本数据。因为varchar是变长存储,所以比char节省空间。MySQL服务器层规定一行中的所有文本最多可以存储65535字节,所以utf8字符集中最多可以存储21844个字符,会自动转换为mediumtext字段。而text最多可以存储21844个utf8字符集,mediumtext最多可以存储2^24/3个字符,longtext最多可以存储2^32个字符。一般推荐使用varchar类型,字符数不要超过2700。 查看全部
php抓取网页数据插入数据库(PM需遵守的数据库设计与创建规范)
1.一般
为规范公司各种环境下数据库系统的设计和创建过程,提高数据库系统的开发效率,保证数据库系统的性能和安全稳定运行,特制定本规范。
该规范涉及 PM、RD、SQ 和 DBA 四个角色。数据库系统设计和创建过程中各个角色的工作内容会按照【高风险】、【强制】、【推荐】三个级别进行标注,按照优先级从高到低。
对于不符合【高风险】和【强制】两个级别的工作内容,DBA将强制其回电并要求修改。
2.适用范围
本规范定义的数据库系统包括部署在传统数据中心(物理机如Cisco UCS)和云(公有云、私有云)中的所有数据库实例。相关数据库实例参考数据库开发和创建的相关规范。
3.PM 应遵循的数据库设计和创建规范
本规范旨在帮助或指导 RD、QA、OP 等技术人员设计和开发适合在线业务的数据库。规范数据库变更及处理流程、数据库表设计、SQL编写等,为公司业务系统稳定健康运行提供保障。
3.1 Mysql设计开发规范
MySQL数据库与Oracle、SQL Server等商业数据库相比,在内核上各有优劣。我们在使用MySQL数据库进行设计开发时,需要遵循一定的规范,扬长避短。
3.1.1 命名约定
数据库对象命名规则的范围是管理平台设计和开发中涉及的表。由其他外部系统创建的表不在本规范的范围内。
表、列、序列、过程、函数等数据库对象应按照以下规则命名:
【强制】名称必须使用有意义的中英文缩写,以字母开头,不能超过32个字符。
【强制】名称必须使用小写字母,
【必选】数据库对象名由以下部分组成:范围、类型、名称实体,下划线“_”用于连接各个单词。
【必填】各个数据库对象的范围和类型的具体含义和取值,请参考各个数据库对象的命名规则。
数据库对象命名规则
【强制】数据库对象的名称不允许是数据库的保留字和关键字。
SELECT id, name, from, age FROM user not allowed
请参阅保留字和关键字的链接
选项/变量参考3.1.2 库规范
【强制】创建数据库时必须明确指定字符集,字符集只能是utf8或utf8mb4。创建数据库 SQL 示例:
创建数据库 db1 默认字符集 utf8;
3.1.3 表结构规范
【强制】创建表时,必须明确指定字符集为utf8或utf8mb4。
【强制】创建表时,必须显式指定表存储引擎类型。如果没有特殊要求,永远都是 InnoDB。当需要使用 InnoDB 以外的存储引擎时,必须经过 DBA 的审核才能在生产环境中使用。因为Innodb表支持事务、行锁、崩溃恢复、MVCC等关系型数据库的重要特性,所以是业界使用最多的MySQL存储引擎。这是大多数其他存储引擎所不具备的,因此 InnoDB 是首选。
【强制】表格必须有注释,数据字典必须从一开始就维护。类状态类型需要指定主值的含义,如“0-离线,1-在线”
【强制】中间表用于存放中间结果集,名称必须以tmp_开头。备份表用于备份或拍摄源表的快照,名称必须以 bak_ 开头。定期清理中间表和备份表。
【强制】对于超过100W行的大表,alter table必须经过DBA审核,并在业务低峰期执行。因为alter table会产生表锁,在此期间阻塞所有对表的写可能对业务有很大的影响。
【建议】关于建表时的主键:(1)强制主键为id,类型为int或bigint,为auto_increment;(2)标识的字段表中每一行的主题不应该设置为主键,建议设置其他字段如user_id、order_id等,并建立唯一键索引。因为如果设置为主键和主键值随机插入,会导致innodb内部分页和大量随机I/O,性能下降。
【建议】核心表(如用户表、钱相关表)必须要有行数据的创建时间字段create_time和最后更新时间字段update_time,方便排查问题。
【建议】建议将表中的blob、text等大字段垂直拆分到其他表中,仅在需要读取这些对象时才选择。
【建议】反范式设计:经常需要join查询的字段的冗余副本放在其他表中。比如user_account、user_login_log等表中user_name属性是多余的,减少了join查询。
3.1.4 字段说明
【建议】表中所有字段必须为NOT NULL属性,商家可根据需要定义DEFAULT值。因为使用NULL值会导致每行额外存储空间、容易出错的数据迁移、聚合函数计算结果偏差等问题。如果不保证插入时一定有值,定义时使用默认值''或0。
使用 NUMBER 类型时,必须指定长度。准确度和密度取自NUMBER,保证数据一致性
表中字段的命名长度不应超过 30 个字节
【推荐】表中自增列(auto_increment属性)推荐使用bigint类型。因为unsigned int的存储范围是-2147483648~2147483647(约21亿),溢出后会报错。
【推荐】对于业务中选择性较少的状态、类型等字段,建议使用tinytint或smallint,以节省存储空间。
【建议】业务中IP地址字段建议使用int类型,不建议使用char(15)。因为int只占4个字节,可以使用以下函数相互转换, 而 char(15) 至少占用 15 个字节。一旦表数据行数达到 1 亿,就需要使用更多的 1.1G 存储空间。
SQL: 选择 inet_aton('192.168.2.12'); 选择 inet_ntoa(3232236044);
PHP: ip2long('192.168.2.12'); long2ip(3530427185);
【推荐】不推荐使用enum和set。因为它们浪费空间,而且枚举值是硬编码的,不方便更改。建议使用 Tinyint 或 smallint。
【推荐】不推荐blob、text等类型。它们都浪费硬盘和内存空间。加载表数据时,会将大字段读入内存,浪费内存空间,影响系统性能。是否真的需要这么大的字段,建议与PM和RD沟通。在 Innodb 中,当一行记录超过 8098 字节时,将选择记录中最长的字段,并将其中的 768 字节放在原创页中,其余字段将放在溢出页中。不幸的是,在紧凑行格式中,原创页面和溢出页面都被加载了。
【建议】存钱的字段,推荐使用int,终端乘以100除以100访问。因为 int 占用 4 个字节,double 占用 8 个字节,所以浪费空间。
【建议】尽量使用varchar存储文本数据。因为varchar是变长存储,所以比char节省空间。MySQL服务器层规定一行中的所有文本最多可以存储65535字节,所以utf8字符集中最多可以存储21844个字符,会自动转换为mediumtext字段。而text最多可以存储21844个utf8字符集,mediumtext最多可以存储2^24/3个字符,longtext最多可以存储2^32个字符。一般推荐使用varchar类型,字符数不要超过2700。
php抓取网页数据插入数据库(e.World开发的PHP代码自动生成工具-PHPMaker中文版)
网站优化 • 优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2022-04-18 23:23
PHPMaker中文版是e.World Technology开发的PHP代码自动生成工具。PHPMaker中文版是一款在Windows平台上运行的基于MYSQL数据库自动生成PHP脚本的软件。使用生成的PHP代码,用户可以通过WEB页面浏览、修改、查询、增删数据库中的记录。使用该软件,用户只需几个步骤即可获得完整的 PHP 代码。
基本介绍
PHP代码自动生成工具,一款运行在Windows平台上的基于MYSQL数据库自动生成PHP脚本的软件。使用生成的PHP代码,可以通过WEB页面浏览、修改、查询、增删数据库中的记录。使用它,您只需几个步骤即可获得完整的 PHP 代码。生成的代码清晰易懂,方便开发者在此基础上进行开发。
软件功能
PHPMaker 生成数据库辅助,生成数据库辅助包括当前或其他项目,简单访问数据库和检索数据
PHPMaker中文版使用handlebars.js——typeahead.js的自定义模板
细节记录在主视图中
在主/详细视图中将详细记录导出到 CSV
多个文件上传分隔符用于分隔,指定文件上传分隔符的文件名
使用颜色框图像
使用响应式布局
在移动中使用下拉菜单,使用按钮下拉菜单而不是按钮组以在移动模式下为数据节省更多空间 查看全部
php抓取网页数据插入数据库(e.World开发的PHP代码自动生成工具-PHPMaker中文版)
PHPMaker中文版是e.World Technology开发的PHP代码自动生成工具。PHPMaker中文版是一款在Windows平台上运行的基于MYSQL数据库自动生成PHP脚本的软件。使用生成的PHP代码,用户可以通过WEB页面浏览、修改、查询、增删数据库中的记录。使用该软件,用户只需几个步骤即可获得完整的 PHP 代码。

基本介绍
PHP代码自动生成工具,一款运行在Windows平台上的基于MYSQL数据库自动生成PHP脚本的软件。使用生成的PHP代码,可以通过WEB页面浏览、修改、查询、增删数据库中的记录。使用它,您只需几个步骤即可获得完整的 PHP 代码。生成的代码清晰易懂,方便开发者在此基础上进行开发。
软件功能
PHPMaker 生成数据库辅助,生成数据库辅助包括当前或其他项目,简单访问数据库和检索数据
PHPMaker中文版使用handlebars.js——typeahead.js的自定义模板
细节记录在主视图中
在主/详细视图中将详细记录导出到 CSV
多个文件上传分隔符用于分隔,指定文件上传分隔符的文件名
使用颜色框图像
使用响应式布局
在移动中使用下拉菜单,使用按钮下拉菜单而不是按钮组以在移动模式下为数据节省更多空间
php抓取网页数据插入数据库(教你PowerBI获取网址数据的具体操作方法(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 86 次浏览 • 2022-04-18 23:19
Power BI 是一款专业的交互式数据可视化 BI 工具。Power BI 具有内置的 Excel 电子表格、云服务、流数据和本地数据库——无论您的数据位于何处或采用何种格式,您都可以全面了解您的业务的关键指标。使用 Power BI,用户可以与主要利益相关者协作,以确保每个人都使用正确的数据。下面小编将教大家如何在Power BI中获取URL数据。我希望你会喜欢。
Power BI 如何获取 URL 数据:
从网页抓取数据时,如果数据本身以表格的形式存储在网页上,则可以通过简单的选择进行抓取。当数据不是以表格的形式,而是以列表的形式存储在网页中,并且是超链接文本时,您可以尝试power bi desktop的智能“添加表格使用示例”。
1、点击“获取数据”>“Web”,在弹出的对话框中输入网址,点击“确定”
3、接下来我们需要做的就是提供一个表格,其中收录我们需要提取的数据示例。
上面介绍的内容是关于Power BI获取URL数据的具体操作方法。不知道你有没有学过。如果你也遇到这样的问题,可以按照小编的方法自己试试。我希望它可以帮助您解决问题。谢谢 !!!更多软件教程请关注Win10传闻传送门:CWCSM.Com~~~~ 查看全部
php抓取网页数据插入数据库(教你PowerBI获取网址数据的具体操作方法(图))
Power BI 是一款专业的交互式数据可视化 BI 工具。Power BI 具有内置的 Excel 电子表格、云服务、流数据和本地数据库——无论您的数据位于何处或采用何种格式,您都可以全面了解您的业务的关键指标。使用 Power BI,用户可以与主要利益相关者协作,以确保每个人都使用正确的数据。下面小编将教大家如何在Power BI中获取URL数据。我希望你会喜欢。
Power BI 如何获取 URL 数据:
从网页抓取数据时,如果数据本身以表格的形式存储在网页上,则可以通过简单的选择进行抓取。当数据不是以表格的形式,而是以列表的形式存储在网页中,并且是超链接文本时,您可以尝试power bi desktop的智能“添加表格使用示例”。
1、点击“获取数据”>“Web”,在弹出的对话框中输入网址,点击“确定”

3、接下来我们需要做的就是提供一个表格,其中收录我们需要提取的数据示例。
上面介绍的内容是关于Power BI获取URL数据的具体操作方法。不知道你有没有学过。如果你也遇到这样的问题,可以按照小编的方法自己试试。我希望它可以帮助您解决问题。谢谢 !!!更多软件教程请关注Win10传闻传送门:CWCSM.Com~~~~
php抓取网页数据插入数据库(我编写了一个脚本来从网站上的php文件中获取数据 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2022-04-18 18:12
)
我编写了一个脚本来从 网站 上的 php 文件中获取数据。我编写了脚本,以便它仅在页面上的当前数据与上次从页面获取数据时发生更改时才输出数据。该页面确实需要身份验证,这就是我添加 PHPSESSID 的原因。这将允许查看页面。Cloudflare 已实施
访问前检查您的浏览器。
这个过程是自动的。您的浏览器将很快重定向到您请求的内容。请允许最多 5 秒...
这破坏了我的脚本,它无法从页面获取数据。我查看了 cfscrape 并且无法弄清楚如何将它实现到我当前的脚本中以使其正常工作。如果有人可以提供帮助,那就太好了!我讨厌不得不寻求帮助,但我有点需要尽快让这个工作。
#!/usr/bin/python
from time import sleep
import re
import hashlib
import urllib2
import winsound
def doMd5(data):
mdo = hashlib.md5()
mdo.update(data)
return mdo.hexdigest()
def doRequest():
try:
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
'Cookie': 'PHPSESSID=ldc1bp9mj7n4ocffvftm25te62'}
req = urllib2.Request('http://www.example.com/random/random.php', headers=head)
res = urllib2.urlopen(req)
data = res.read()
return data
except:
return "exception"
last_log = ""
while True:
data = doRequest()
if data == "exception" or data == "":
print "Exception!"
continue
new_hash = doMd5(data)
if new_hash != last_log:
print "New Data"
winsound.Beep(100, 80)
handler = open('data.html', 'a')
handler.write(data + '\n')
handler.close()
last_log = new_hash
else:
sleep(3)
print "Refreshing..."
continue 查看全部
php抓取网页数据插入数据库(我编写了一个脚本来从网站上的php文件中获取数据
)
我编写了一个脚本来从 网站 上的 php 文件中获取数据。我编写了脚本,以便它仅在页面上的当前数据与上次从页面获取数据时发生更改时才输出数据。该页面确实需要身份验证,这就是我添加 PHPSESSID 的原因。这将允许查看页面。Cloudflare 已实施
访问前检查您的浏览器。
这个过程是自动的。您的浏览器将很快重定向到您请求的内容。请允许最多 5 秒...
这破坏了我的脚本,它无法从页面获取数据。我查看了 cfscrape 并且无法弄清楚如何将它实现到我当前的脚本中以使其正常工作。如果有人可以提供帮助,那就太好了!我讨厌不得不寻求帮助,但我有点需要尽快让这个工作。
#!/usr/bin/python
from time import sleep
import re
import hashlib
import urllib2
import winsound
def doMd5(data):
mdo = hashlib.md5()
mdo.update(data)
return mdo.hexdigest()
def doRequest():
try:
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
'Cookie': 'PHPSESSID=ldc1bp9mj7n4ocffvftm25te62'}
req = urllib2.Request('http://www.example.com/random/random.php', headers=head)
res = urllib2.urlopen(req)
data = res.read()
return data
except:
return "exception"
last_log = ""
while True:
data = doRequest()
if data == "exception" or data == "":
print "Exception!"
continue
new_hash = doMd5(data)
if new_hash != last_log:
print "New Data"
winsound.Beep(100, 80)
handler = open('data.html', 'a')
handler.write(data + '\n')
handler.close()
last_log = new_hash
else:
sleep(3)
print "Refreshing..."
continue
php抓取网页数据插入数据库(php抓取网页数据插入数据库首先我们打开一个项目)
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-04-17 09:44
php抓取网页数据插入数据库首先我们打开一个项目:phpsphere.php,然后执行这段命令:www:phpsphere-i"#!/usr/bin/php-f"database:{}""host:{}""$_post[‘*’]或者www:phpsphere-i"#!/usr/bin/php-f"database:{}""host:{}""$_post然后我们在这里来看一下我们的数据:提取的数据放在了/users/xxx/.php/data/中,一个sqlite格式的存储数据库文件,而这个数据库是运行在一个网站上。
sqlite数据库_百度百科接下来我们就使用phpstorm打开命令窗口,我们从文件中取出需要的数据放到数据库。然后我们使用我们上面已经准备好的数据。$_post[‘*’]:我们命令语句中放置的‘*’就是我们需要提取的数据,我们想提取第5万6千2百7十三个数据,但是我们知道这个数据在phpserver中是可以获取到的,但是要使用phpstorm来提取,如果手动去获取这个数据,就需要修改php程序中的'cache_commit'项,直接使用这个项可能是无法获取到数据,这时我们就需要用到phpstorm命令窗口中的命令:$_post[‘*’],此时用phpstorm提取之后就可以直接在终端中使用了,那么这样我们的数据库就修改好了,接下来我们需要做的就是把我们的php脚本放在一个工程中,我把它放在:code。
如下图:这里我刚才写好的脚本放在上面工程中的repo中(repo:code/phpadober.git),然后把我们的数据库放在我们的工程文件下面,如下图:然后打开phpstorm或者是其他的编辑器我们会看到这样一个界面:接下来我们开始添加数据:databases:我们需要将我们的数据放在这个地方,因为后面接受该数据的命令是用conn命令进行传入的,如下图:第一个数据就是conn(*)文件的内容。
用$_post[‘*’]来取数据可以直接访问它获取数据。at:我们在这里将我们的数据放在这里就需要把下面这个{‘at’}注释掉,不然我们后面使用phps来搜索不到数据emails:同样我们要将数据emails放在这里types:text/json,文本文件或者是json文件都可以,json文件是存储多文件的数据库中的内容,它的type命令(json)就是我们提取出来的数据类型。
contents:我们要将获取到的数据放到这里,json文件是存储一个url,就是下面的json格式数据{“at”},但是我们不想要我们写的文件夹都存储在contents中,我们还是需要知道如何存储。tables:同样我们也需要将他们存储到这里,我们只需要知道如何放置就可以了。filenames:需要创建我们文件夹的路径,就创建。 查看全部
php抓取网页数据插入数据库(php抓取网页数据插入数据库首先我们打开一个项目)
php抓取网页数据插入数据库首先我们打开一个项目:phpsphere.php,然后执行这段命令:www:phpsphere-i"#!/usr/bin/php-f"database:{}""host:{}""$_post[‘*’]或者www:phpsphere-i"#!/usr/bin/php-f"database:{}""host:{}""$_post然后我们在这里来看一下我们的数据:提取的数据放在了/users/xxx/.php/data/中,一个sqlite格式的存储数据库文件,而这个数据库是运行在一个网站上。
sqlite数据库_百度百科接下来我们就使用phpstorm打开命令窗口,我们从文件中取出需要的数据放到数据库。然后我们使用我们上面已经准备好的数据。$_post[‘*’]:我们命令语句中放置的‘*’就是我们需要提取的数据,我们想提取第5万6千2百7十三个数据,但是我们知道这个数据在phpserver中是可以获取到的,但是要使用phpstorm来提取,如果手动去获取这个数据,就需要修改php程序中的'cache_commit'项,直接使用这个项可能是无法获取到数据,这时我们就需要用到phpstorm命令窗口中的命令:$_post[‘*’],此时用phpstorm提取之后就可以直接在终端中使用了,那么这样我们的数据库就修改好了,接下来我们需要做的就是把我们的php脚本放在一个工程中,我把它放在:code。
如下图:这里我刚才写好的脚本放在上面工程中的repo中(repo:code/phpadober.git),然后把我们的数据库放在我们的工程文件下面,如下图:然后打开phpstorm或者是其他的编辑器我们会看到这样一个界面:接下来我们开始添加数据:databases:我们需要将我们的数据放在这个地方,因为后面接受该数据的命令是用conn命令进行传入的,如下图:第一个数据就是conn(*)文件的内容。
用$_post[‘*’]来取数据可以直接访问它获取数据。at:我们在这里将我们的数据放在这里就需要把下面这个{‘at’}注释掉,不然我们后面使用phps来搜索不到数据emails:同样我们要将数据emails放在这里types:text/json,文本文件或者是json文件都可以,json文件是存储多文件的数据库中的内容,它的type命令(json)就是我们提取出来的数据类型。
contents:我们要将获取到的数据放到这里,json文件是存储一个url,就是下面的json格式数据{“at”},但是我们不想要我们写的文件夹都存储在contents中,我们还是需要知道如何存储。tables:同样我们也需要将他们存储到这里,我们只需要知道如何放置就可以了。filenames:需要创建我们文件夹的路径,就创建。
php抓取网页数据插入数据库(故需修改一下_max_filesize=10M(file提交文件大小限制))
网站优化 • 优采云 发表了文章 • 0 个评论 • 183 次浏览 • 2022-04-17 08:06
一般我们上传图片的传统方式是将图片保存在服务器的本地文件夹中。这里简单介绍一下直接将图片存入数据库的方法。
mysql 数据库提供了 Blob 类型来存储大量数据。BLOB有四种类型,可以容纳不同大小的数据。
高达 255B 的 TinyBlob
高达 65K 的 Blob
高达 16M 的 MediumBlob
LongBlob 高达 4G
需要注意的是,php配置文件本身对post表单数据的大小有限制,对文件提交的文件大小也有限制。所以需要到php.ini去修改
upload_max_filesize=10M(文件提交文件大小限制)
post_max_size=10M(表单数据大小限制)
我用php做一个简单的注册例子。
mysql表的设计(字段命名有点不规范,实际项目中需要注意字段命名规范)
数据库连接文件 conn.php
$conn = @mysql_connect('localhost' , 'userName' , 'passWord') or die(mysql_error()); //连接数据库
mysql_query('set names utf8' , $conn); //设置连接字符集
@mysql_select_db('user' , $conn) or die(mysql_error()); //连接数据表
注册表单register.html的实现(选择关键部分)
img/5.png
上传头像
请选择报研学校
中南大学
电子科技大学
上海交通大学
华南理工大学
上传图片和注册页面 register.php
至此,一个简单的图片上传到数据库的操作就完成了。
笔记:
1) php 配置文件大小限制
2) 用form上传文件时,一定要加上属性content enctype="multipart/form-data",否则使用$_FILES[ 'photo' ] [ 'tmp_name' ] 获取时会报异常文件信息(文件名不能为空...)
随后的更新读取数据库中的图像并输出它们。
未完待续,待续。 查看全部
php抓取网页数据插入数据库(故需修改一下_max_filesize=10M(file提交文件大小限制))
一般我们上传图片的传统方式是将图片保存在服务器的本地文件夹中。这里简单介绍一下直接将图片存入数据库的方法。
mysql 数据库提供了 Blob 类型来存储大量数据。BLOB有四种类型,可以容纳不同大小的数据。
高达 255B 的 TinyBlob
高达 65K 的 Blob
高达 16M 的 MediumBlob
LongBlob 高达 4G
需要注意的是,php配置文件本身对post表单数据的大小有限制,对文件提交的文件大小也有限制。所以需要到php.ini去修改
upload_max_filesize=10M(文件提交文件大小限制)
post_max_size=10M(表单数据大小限制)
我用php做一个简单的注册例子。
mysql表的设计(字段命名有点不规范,实际项目中需要注意字段命名规范)
数据库连接文件 conn.php
$conn = @mysql_connect('localhost' , 'userName' , 'passWord') or die(mysql_error()); //连接数据库
mysql_query('set names utf8' , $conn); //设置连接字符集
@mysql_select_db('user' , $conn) or die(mysql_error()); //连接数据表
注册表单register.html的实现(选择关键部分)
img/5.png
上传头像
请选择报研学校
中南大学
电子科技大学
上海交通大学
华南理工大学
上传图片和注册页面 register.php
至此,一个简单的图片上传到数据库的操作就完成了。
笔记:
1) php 配置文件大小限制
2) 用form上传文件时,一定要加上属性content enctype="multipart/form-data",否则使用$_FILES[ 'photo' ] [ 'tmp_name' ] 获取时会报异常文件信息(文件名不能为空...)
随后的更新读取数据库中的图像并输出它们。
未完待续,待续。
php抓取网页数据插入数据库(PHP给MYSQL插入新数据和更新数据方法以及实现代码 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-04-15 14:41
)
在做网站的时候,我们经常需要使用PHP向MYSQL中插入新数据或者更新MYSQL数据库中的数据。这一切都需要使用 MYSQL 语句。本节学做网站论坛介绍PHP到MYSQL中插入新数据和更新数据的方法及其实现代码。
第一种:PHP向MYSQL插入新数据
INSERT INTO 语句通常用于向 MySQL 表添加新记录:
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...);
table_name 是数据表的名称; column1, column2...是字段名; value1, value2...是插入的值。
如果你想用PHP来执行这个语句,可以这样写:
$sql = "INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)";
二:PHP更新数据到MYSQL
如果数据表有对应字段的值,如果要改变字段的值,需要用PHP更新MYSQL数据。
UPDATE 语句用于更新数据库表中的现有记录。
UPDATE table_name SET column1=value, column2=value2,...WHERE some_column=some_value
注意:注意 UPDATE 语法中的 WHERE 子句。 WHERE 子句指定需要更新哪些记录。如果你想省略 WHERE 子句,所有记录都会被更新!
第三种:自动判断字段是否有值,有值则更新,无值则插入新数据。
replace into 与 insert 类似,只是 replace into 先尝试将数据插入到表中。
需要注意的是,插入数据的表必须有主键或唯一索引。否则replace into会直接插入数据,导致表中有重复数据。
$sql = "REPLACE INTO $sqldz<br />
SET post_id = $postid,<br />
meta_key = 'baidusl',<br />
meta_value = '1'";<br />
$r = mysqli_query($conn,$sql);//执行SQL 查看全部
php抓取网页数据插入数据库(PHP给MYSQL插入新数据和更新数据方法以及实现代码
)
在做网站的时候,我们经常需要使用PHP向MYSQL中插入新数据或者更新MYSQL数据库中的数据。这一切都需要使用 MYSQL 语句。本节学做网站论坛介绍PHP到MYSQL中插入新数据和更新数据的方法及其实现代码。

第一种:PHP向MYSQL插入新数据
INSERT INTO 语句通常用于向 MySQL 表添加新记录:
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...);
table_name 是数据表的名称; column1, column2...是字段名; value1, value2...是插入的值。
如果你想用PHP来执行这个语句,可以这样写:
$sql = "INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)";
二:PHP更新数据到MYSQL
如果数据表有对应字段的值,如果要改变字段的值,需要用PHP更新MYSQL数据。
UPDATE 语句用于更新数据库表中的现有记录。
UPDATE table_name SET column1=value, column2=value2,...WHERE some_column=some_value
注意:注意 UPDATE 语法中的 WHERE 子句。 WHERE 子句指定需要更新哪些记录。如果你想省略 WHERE 子句,所有记录都会被更新!
第三种:自动判断字段是否有值,有值则更新,无值则插入新数据。
replace into 与 insert 类似,只是 replace into 先尝试将数据插入到表中。
需要注意的是,插入数据的表必须有主键或唯一索引。否则replace into会直接插入数据,导致表中有重复数据。
$sql = "REPLACE INTO $sqldz<br />
SET post_id = $postid,<br />
meta_key = 'baidusl',<br />
meta_value = '1'";<br />
$r = mysqli_query($conn,$sql);//执行SQL
php抓取网页数据插入数据库(PHP缓存机制类触发静态缓存的应用方法解析!!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-04-14 09:26
1、通用缓存技术:
数据缓存:这里所说的数据缓存是指数据库查询PHP缓存技术机制。每次访问一个页面,都会先检测对应的缓存数据是否存在。如果不存在,则连接数据库,获取数据,放入查询结果。序列化后保存到文件中,以后直接从缓存表或文件中获取相同的查询结果。
使用最广泛的例子是看Discuz的搜索功能,将结果ID缓存在一个表中,下次搜索相同关键字时先搜索缓存表。
给出一个通用的方法,当关联多个表时,生成附表中的内容并存储在主表的一个字段中,并在需要时分解数组。这样做的好处是只读取一张表,但缺点是有两个数据同步的步骤会比较多,数据库永远是瓶颈。这样做的关键是使用硬盘来提高速度。
2、 页面缓存:
每次访问一个页面,都会先检测对应的缓存页面文件是否存在。如果不存在,则连接数据库,获取数据,显示页面,同时生成缓存的页面文件,以便页面文件在下次访问时发挥作用。. (模板引擎和网上一些常见的PHP缓存机制类一般都有这个功能)
3、 时间触发缓存:
检查文件是否存在,时间戳是否小于设置的过期时间。如果文件修改时间戳大于当前时间戳减去过期时间戳,则使用缓存,否则更新缓存。
4、 内容触发缓存:
在插入数据或更新数据时强制更新 PHP 缓存机制。
5、 静态缓存:
这里所说的静态缓存是指页面的静态化,直接生成HTML或XML等文本文件,有更新时重新生成一次,适用于变化不大的页面。
以上内容为代码级方案,以下内容为服务端缓存方案,非代码级方案只能通过多方合作实现
6、 内存缓存:
Memcached 是一种高性能、分布式内存对象 PHP 缓存机制系统,用于减少数据库负载并提高动态应用程序的访问速度。
7、 php 缓冲区:
有eaccelerator,apc,phpa,xcache,这个就不说了,搜一堆,自己看看,如果知道有这种东西就OK了
8、 MYSQL 缓存:
这也算是非代码级别的,经典数据库就是这样用的,看下面的运行时间,0.09xxx等
9、 基于反向代理的网络缓存:
如Nginx、SQUID、mod_proxy(apache2及以上分为mod_proxy和mod_cache)
10、 DNS 轮询:
BIND 是一个开源的 DNS 服务器软件。这是一个大问题。自己搜一下,大家都知道有这个东西。
我知道一些大型网站,如 chinacache 会这样做。简单来说,就是多台服务器。同一个页面或文件缓存在不同的服务器上,根据南北自动解析到相关服务器。 查看全部
php抓取网页数据插入数据库(PHP缓存机制类触发静态缓存的应用方法解析!!)
1、通用缓存技术:
数据缓存:这里所说的数据缓存是指数据库查询PHP缓存技术机制。每次访问一个页面,都会先检测对应的缓存数据是否存在。如果不存在,则连接数据库,获取数据,放入查询结果。序列化后保存到文件中,以后直接从缓存表或文件中获取相同的查询结果。
使用最广泛的例子是看Discuz的搜索功能,将结果ID缓存在一个表中,下次搜索相同关键字时先搜索缓存表。
给出一个通用的方法,当关联多个表时,生成附表中的内容并存储在主表的一个字段中,并在需要时分解数组。这样做的好处是只读取一张表,但缺点是有两个数据同步的步骤会比较多,数据库永远是瓶颈。这样做的关键是使用硬盘来提高速度。
2、 页面缓存:
每次访问一个页面,都会先检测对应的缓存页面文件是否存在。如果不存在,则连接数据库,获取数据,显示页面,同时生成缓存的页面文件,以便页面文件在下次访问时发挥作用。. (模板引擎和网上一些常见的PHP缓存机制类一般都有这个功能)
3、 时间触发缓存:
检查文件是否存在,时间戳是否小于设置的过期时间。如果文件修改时间戳大于当前时间戳减去过期时间戳,则使用缓存,否则更新缓存。
4、 内容触发缓存:
在插入数据或更新数据时强制更新 PHP 缓存机制。
5、 静态缓存:
这里所说的静态缓存是指页面的静态化,直接生成HTML或XML等文本文件,有更新时重新生成一次,适用于变化不大的页面。
以上内容为代码级方案,以下内容为服务端缓存方案,非代码级方案只能通过多方合作实现
6、 内存缓存:
Memcached 是一种高性能、分布式内存对象 PHP 缓存机制系统,用于减少数据库负载并提高动态应用程序的访问速度。
7、 php 缓冲区:
有eaccelerator,apc,phpa,xcache,这个就不说了,搜一堆,自己看看,如果知道有这种东西就OK了
8、 MYSQL 缓存:
这也算是非代码级别的,经典数据库就是这样用的,看下面的运行时间,0.09xxx等
9、 基于反向代理的网络缓存:
如Nginx、SQUID、mod_proxy(apache2及以上分为mod_proxy和mod_cache)
10、 DNS 轮询:
BIND 是一个开源的 DNS 服务器软件。这是一个大问题。自己搜一下,大家都知道有这个东西。
我知道一些大型网站,如 chinacache 会这样做。简单来说,就是多台服务器。同一个页面或文件缓存在不同的服务器上,根据南北自动解析到相关服务器。
php抓取网页数据插入数据库(thinkphp插入数据库操作错误从excel读取数据插入mysql,生成sql正确)
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-04-13 08:34
thinkphp插入数据库操作错误
thinkphp从excel中读取数据插入mysql,生成的sql语句正确,可以单独执行。
$model->execute($sql),执行时,只插入第一个字符到任何字符串中。生成的sql语句是这样的:insertintotablevalues('','ABCDEF'),就不一一列举了,只是一个例子,insert单独执行成功,在thinkphp中执行,只在字符串ABCDEF中插入了一个A。在tp中打印出最后执行的sql语句也是正确的
thinkphpMySQL数据库
分享到:execute($sql),执行时,任何字符串只插入第一个字符。生成 sq...' data-pics=''>
- - - 解决方案 - - - - - - - - - -
直接执行结果一样吗?我认为它会受到数据库字段的类型和长度的限制。如果直接执行是一样的,那我得跟踪TP最后的mysql_query,检查mysql_query之前的$sql
- - - 解决方案 - - - - - - - - - -
引用: 引用: 引用:
直接执行结果一样吗?我认为它会受到数据库字段的类型和长度的限制。如果直接执行是一样的,那我得跟踪TP最后的mysql_query,检查mysql_query之前的$sql
你可以说得更详细点吗?谢谢
实际上,您应该在此处描述详细信息。
没有没有解决办法的“精神问题”,一定是某处有问题
以我的拙见,要么是TP对SQL语句的处理有问题,要么是mysql的数据结构/类型有问题。我想不出其他的可能性。
所以先尝试手动编写SQL语句,直接在mysql中执行,看看效果。现在你说插入成功了,那么插入之后的结果呢?你也想要吗?
如果手动插入结果正确,在TP框架中找到TP插入mysql语句,将此时的SQL语句打印出来,看是否和你手写的SQL语句一致。
那么最好仔细看看......
当然,可能有一些大神遇到过这种问题,可以指出原因,但在此之前,你可以试试这个找到原因 查看全部
php抓取网页数据插入数据库(thinkphp插入数据库操作错误从excel读取数据插入mysql,生成sql正确)
thinkphp插入数据库操作错误
thinkphp从excel中读取数据插入mysql,生成的sql语句正确,可以单独执行。
$model->execute($sql),执行时,只插入第一个字符到任何字符串中。生成的sql语句是这样的:insertintotablevalues('','ABCDEF'),就不一一列举了,只是一个例子,insert单独执行成功,在thinkphp中执行,只在字符串ABCDEF中插入了一个A。在tp中打印出最后执行的sql语句也是正确的
thinkphpMySQL数据库
分享到:execute($sql),执行时,任何字符串只插入第一个字符。生成 sq...' data-pics=''>
- - - 解决方案 - - - - - - - - - -
直接执行结果一样吗?我认为它会受到数据库字段的类型和长度的限制。如果直接执行是一样的,那我得跟踪TP最后的mysql_query,检查mysql_query之前的$sql
- - - 解决方案 - - - - - - - - - -
引用: 引用: 引用:
直接执行结果一样吗?我认为它会受到数据库字段的类型和长度的限制。如果直接执行是一样的,那我得跟踪TP最后的mysql_query,检查mysql_query之前的$sql
你可以说得更详细点吗?谢谢
实际上,您应该在此处描述详细信息。
没有没有解决办法的“精神问题”,一定是某处有问题
以我的拙见,要么是TP对SQL语句的处理有问题,要么是mysql的数据结构/类型有问题。我想不出其他的可能性。
所以先尝试手动编写SQL语句,直接在mysql中执行,看看效果。现在你说插入成功了,那么插入之后的结果呢?你也想要吗?
如果手动插入结果正确,在TP框架中找到TP插入mysql语句,将此时的SQL语句打印出来,看是否和你手写的SQL语句一致。
那么最好仔细看看......
当然,可能有一些大神遇到过这种问题,可以指出原因,但在此之前,你可以试试这个找到原因
php抓取网页数据插入数据库( PHP获取要删除数据库表中的数据插入新的表再原删除数据 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-04-13 08:13
PHP获取要删除数据库表中的数据插入新的表再原删除数据
)
PHP获取数据库表中的数据,插入新表,然后删除数据方法
2019-09-02 10:26老张PHP教程
在本文文章中,我们与大家分享PHP获取要删除的数据库表中的数据,插入新表,然后删除数据的详细方法和相关代码。
1、我用get做路由
(1) 控制器
public function a(Request $request){
//获取指定的id
$id = $request->id;
$rs=R::find($id);
//仓库中
$re=$rs->rfid;
//判断仓库中的是否与数据库的rf在线的是否相等
$ws= G::where('rfid','=',$re)->first();
if($ws){
return response()->json(['status'=>0,'msg'=>'不成功']);
}
//导入数据
$sql=DB::insert("insert into gs( g ,id,created_at,updated_at) values (?,?,?,?)",
[$rs->p,$rs->r,$rs->creat,$rs->up]);
// 成功删除
if($sql){
$rs->delete();
return ['status'=>1,'msg'=>'成功'];
}else{
return response()->json(['status'=>0,'msg'=>'不成功']);
}
(2) 视图
关联
(3)js 注释
图层插件
$(".change").click(function () {
var id = $(this).data("id");
if(confirm("确定xxx")){
$.ajax({
url: '/',
type: 'get',
data: {'id':id},
success: function (res) {
if (res.status == 0) {
layer.msg(res.msg);
} else {
layer.msg(res.msg, {icon: 1}, function () {
location.href = '要跳转的页面';
});
}
}
});
}
}); 查看全部
php抓取网页数据插入数据库(
PHP获取要删除数据库表中的数据插入新的表再原删除数据
)
PHP获取数据库表中的数据,插入新表,然后删除数据方法
2019-09-02 10:26老张PHP教程
在本文文章中,我们与大家分享PHP获取要删除的数据库表中的数据,插入新表,然后删除数据的详细方法和相关代码。
1、我用get做路由
(1) 控制器
public function a(Request $request){
//获取指定的id
$id = $request->id;
$rs=R::find($id);
//仓库中
$re=$rs->rfid;
//判断仓库中的是否与数据库的rf在线的是否相等
$ws= G::where('rfid','=',$re)->first();
if($ws){
return response()->json(['status'=>0,'msg'=>'不成功']);
}
//导入数据
$sql=DB::insert("insert into gs( g ,id,created_at,updated_at) values (?,?,?,?)",
[$rs->p,$rs->r,$rs->creat,$rs->up]);
// 成功删除
if($sql){
$rs->delete();
return ['status'=>1,'msg'=>'成功'];
}else{
return response()->json(['status'=>0,'msg'=>'不成功']);
}
(2) 视图
关联
(3)js 注释
图层插件
$(".change").click(function () {
var id = $(this).data("id");
if(confirm("确定xxx")){
$.ajax({
url: '/',
type: 'get',
data: {'id':id},
success: function (res) {
if (res.status == 0) {
layer.msg(res.msg);
} else {
layer.msg(res.msg, {icon: 1}, function () {
location.href = '要跳转的页面';
});
}
}
});
}
});
php抓取网页数据插入数据库(web服务器可以用三种方法来利用PHP用作一个“外壳”)
网站优化 • 优采云 发表了文章 • 0 个评论 • 118 次浏览 • 2022-04-12 09:13
//------------------------------------------------ ----
数据库永久连接
持久数据库连接是脚本完成运行时未关闭的连接。收到永久连接请求时。PHP 将检查是否已经存在相同的持久连接(之前已经打开)。如果存在,则直接使用连接;如果它不存在,将建立一个新的连接。所谓“同”连接,是指用相同的用户名和密码连接到同一台主机。
不完全了解 Web 服务器的工作和分配负载的读者可能会误解持久连接的作用。特别是,持久连接不提供在同一连接上建立“用户会话”的能力,也不提供有效建立事务的能力。事实上,严格来说,持久连接并没有提供非持久连接所不能提供的任何特殊功能。
为什么?
这与 Web 服务器的工作方式有关。Web 服务器可以使用 PHP 以三种方式生成网页。
第一种方法是使用 PHP 作为“外壳”。以这种方式运行,PHP 会为向 Web 服务器发出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程在每个请求结束时结束,因此在该线程中使用的任何资源(例如与 SQL 数据库服务器的连接)都将在线程结束时关闭。在这种情况下,使用永久连接不会改变任何东西——因为它们根本不是永久的。
第二种也是最常见的方法是使用 PHP 作为多进程 Web 服务器的模块,目前仅适用于 Apache。对于多进程服务器来说,典型的特点是有一个父进程和一组子进程协同运行,而真正生成网页的是子进程。每当客户端向父进程发出请求时,该请求就会被传递给未被其他客户端请求占用的子进程。这意味着当同一个客户端向服务器发出第二个请求时,它很可能由不同的子进程处理。开启持久连接后,后续所有请求SQL服务的页面都可以复用已建立的SQLServer连接。
最后一种方法是使用 PHP 作为多线程 Web 服务器的插件。目前 PHP4 已经支持 ISAPI、WSAPI 和 NSAPI(在 Windows 环境下),这使得 PHP 可以作为 NetscapeFastTrack (iPlanet)、微软的 Internet Information Server (IIS) 和 O'Reilly's 等多线程 Web 服务器的插件使用。网站专业版。持久连接的行为本质上与前面描述的多进程模型相同。请注意,PHP3 不支持 SAPI。
如果没有任何附加功能,使用永久连接有什么好处?
答案很简单——效率。当客户端对 SQL 服务器的连接请求非常频繁时,持久连接更有效。频繁连接请求的标准取决于许多因素。比如数据库的种类,数据库服务和web服务是否在同一台服务器上,SQL服务器如何加载负载等等。但我们至少知道,当连接请求非常频繁时,永久连接会显着提高效率。它允许每个子进程在其生命周期中只进行一次连接操作,而不是每次处理一个页面时都向 SQL 服务器发出连接请求。这意味着每个子进程都将建立自己独立的与服务器的永久连接。例如,
注意,如果永久连接的子进程数超过设置的数据库连接限制,系统会出现一些缺陷。如果数据库有 16 个同时连接的限制,并且在会话繁忙的情况下,有 17 个线程正在尝试连接,那么一个线程将无法连接。如果此时脚本中出现阻止连接关闭的错误(例如无限循环),那么数据库的 16 个连接将很快受到影响。有关如何处理废弃和空闲连接的信息,请查阅您正在使用的数据库的文档。
警告
使用持久连接时需要注意一些特殊问题。例如,在永久连接中使用数据表锁时,如果脚本因任何原因无法释放数据表锁,后续使用同一连接的脚本将被永久阻塞,需要重启httpd服务或数据库服务. 此外,在使用事务时,如果脚本在事务阻塞发生之前结束,阻塞也会影响使用同一连接的下一个脚本。在任何情况下,都可以使用 register_shutdown_function() 函数注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的是,不要在使用表锁或事务的脚本中使用持久连接,
以下是重要的总结。永久连接旨在建立公共连接的一对一分布。这意味着必须能够保证在用非持久连接替换持久连接时脚本的行为不会改变。使用永久连接(非常)可能会改变脚本的效率,但不会改变它的行为!
请参阅 fbsql_pconnect()、ibase_pconnect()、ifx_pconnect()、ingres_pconnect()、msql_pconnect()、mssql_pconnect()、mysql_pconnect()、ociplogon()、odbc_pconnect()、ora_plogon()、pfsockopen()、pg_pconnect() 和sybase_pconnect ( )。
//------------------------------------------------ -------------------------------- 查看全部
php抓取网页数据插入数据库(web服务器可以用三种方法来利用PHP用作一个“外壳”)
//------------------------------------------------ ----
数据库永久连接
持久数据库连接是脚本完成运行时未关闭的连接。收到永久连接请求时。PHP 将检查是否已经存在相同的持久连接(之前已经打开)。如果存在,则直接使用连接;如果它不存在,将建立一个新的连接。所谓“同”连接,是指用相同的用户名和密码连接到同一台主机。
不完全了解 Web 服务器的工作和分配负载的读者可能会误解持久连接的作用。特别是,持久连接不提供在同一连接上建立“用户会话”的能力,也不提供有效建立事务的能力。事实上,严格来说,持久连接并没有提供非持久连接所不能提供的任何特殊功能。
为什么?
这与 Web 服务器的工作方式有关。Web 服务器可以使用 PHP 以三种方式生成网页。
第一种方法是使用 PHP 作为“外壳”。以这种方式运行,PHP 会为向 Web 服务器发出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程在每个请求结束时结束,因此在该线程中使用的任何资源(例如与 SQL 数据库服务器的连接)都将在线程结束时关闭。在这种情况下,使用永久连接不会改变任何东西——因为它们根本不是永久的。
第二种也是最常见的方法是使用 PHP 作为多进程 Web 服务器的模块,目前仅适用于 Apache。对于多进程服务器来说,典型的特点是有一个父进程和一组子进程协同运行,而真正生成网页的是子进程。每当客户端向父进程发出请求时,该请求就会被传递给未被其他客户端请求占用的子进程。这意味着当同一个客户端向服务器发出第二个请求时,它很可能由不同的子进程处理。开启持久连接后,后续所有请求SQL服务的页面都可以复用已建立的SQLServer连接。
最后一种方法是使用 PHP 作为多线程 Web 服务器的插件。目前 PHP4 已经支持 ISAPI、WSAPI 和 NSAPI(在 Windows 环境下),这使得 PHP 可以作为 NetscapeFastTrack (iPlanet)、微软的 Internet Information Server (IIS) 和 O'Reilly's 等多线程 Web 服务器的插件使用。网站专业版。持久连接的行为本质上与前面描述的多进程模型相同。请注意,PHP3 不支持 SAPI。
如果没有任何附加功能,使用永久连接有什么好处?
答案很简单——效率。当客户端对 SQL 服务器的连接请求非常频繁时,持久连接更有效。频繁连接请求的标准取决于许多因素。比如数据库的种类,数据库服务和web服务是否在同一台服务器上,SQL服务器如何加载负载等等。但我们至少知道,当连接请求非常频繁时,永久连接会显着提高效率。它允许每个子进程在其生命周期中只进行一次连接操作,而不是每次处理一个页面时都向 SQL 服务器发出连接请求。这意味着每个子进程都将建立自己独立的与服务器的永久连接。例如,
注意,如果永久连接的子进程数超过设置的数据库连接限制,系统会出现一些缺陷。如果数据库有 16 个同时连接的限制,并且在会话繁忙的情况下,有 17 个线程正在尝试连接,那么一个线程将无法连接。如果此时脚本中出现阻止连接关闭的错误(例如无限循环),那么数据库的 16 个连接将很快受到影响。有关如何处理废弃和空闲连接的信息,请查阅您正在使用的数据库的文档。
警告
使用持久连接时需要注意一些特殊问题。例如,在永久连接中使用数据表锁时,如果脚本因任何原因无法释放数据表锁,后续使用同一连接的脚本将被永久阻塞,需要重启httpd服务或数据库服务. 此外,在使用事务时,如果脚本在事务阻塞发生之前结束,阻塞也会影响使用同一连接的下一个脚本。在任何情况下,都可以使用 register_shutdown_function() 函数注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的是,不要在使用表锁或事务的脚本中使用持久连接,
以下是重要的总结。永久连接旨在建立公共连接的一对一分布。这意味着必须能够保证在用非持久连接替换持久连接时脚本的行为不会改变。使用永久连接(非常)可能会改变脚本的效率,但不会改变它的行为!
请参阅 fbsql_pconnect()、ibase_pconnect()、ifx_pconnect()、ingres_pconnect()、msql_pconnect()、mssql_pconnect()、mysql_pconnect()、ociplogon()、odbc_pconnect()、ora_plogon()、pfsockopen()、pg_pconnect() 和sybase_pconnect ( )。
//------------------------------------------------ --------------------------------
php抓取网页数据插入数据库(PHP访问数据库使用什么数据库语句的参数不需要使用?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-04-11 16:32
PDO(PHP 数据库对象)扩展为 PHP 访问数据库定义了一个轻量级且一致的接口。它提供了一个数据访问抽象层,因此无论使用什么数据库,都可以通过一致的功能执行查询和检索。数据。数据库操作更安全、更高效!
PDO 为 PHP 定义了一个轻量级且一致的接口来访问各种数据库。无论是什么数据库,都可以以一致的方式执行查询和获取数据,而无需考虑不同数据库之间的差异,大大简化了数据库操作。使用PDO可以支持mysql、postgresql、oracle、mssql等数据库。
什么是预处理?
成熟的数据库支持Prepared Statements的概念。
这些是什么?您可以将它们视为要执行的 SQL 语句的编译模板,可以使用不同的变量参数进行自定义。
准备好的语句有两个主要优点:
1、查询只需要解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好 (Prepared) 时,数据库会分析、编译和优化其执行查询的计划。
对于复杂的查询,如果你必须多次重复不同参数但结构相同的查询,这个过程会花费很多时间,并使你的应用程序变慢。
通过使用准备好的语句,您可以避免重复分析、编译和优化。简而言之,准备好的语句使用更少的资源并且执行得更快。
2、传递给预处理语句的参数不需要引用,底层驱动会为你处理。
如果您的应用程序专门使用预准备语句,则可以确保不会发生 SQL 注入。
代码演示:
如果使用pdo预处理插入一条数据,会报错
<p> 查看全部
php抓取网页数据插入数据库(PHP访问数据库使用什么数据库语句的参数不需要使用?)
PDO(PHP 数据库对象)扩展为 PHP 访问数据库定义了一个轻量级且一致的接口。它提供了一个数据访问抽象层,因此无论使用什么数据库,都可以通过一致的功能执行查询和检索。数据。数据库操作更安全、更高效!
PDO 为 PHP 定义了一个轻量级且一致的接口来访问各种数据库。无论是什么数据库,都可以以一致的方式执行查询和获取数据,而无需考虑不同数据库之间的差异,大大简化了数据库操作。使用PDO可以支持mysql、postgresql、oracle、mssql等数据库。
什么是预处理?
成熟的数据库支持Prepared Statements的概念。
这些是什么?您可以将它们视为要执行的 SQL 语句的编译模板,可以使用不同的变量参数进行自定义。
准备好的语句有两个主要优点:
1、查询只需要解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好 (Prepared) 时,数据库会分析、编译和优化其执行查询的计划。
对于复杂的查询,如果你必须多次重复不同参数但结构相同的查询,这个过程会花费很多时间,并使你的应用程序变慢。
通过使用准备好的语句,您可以避免重复分析、编译和优化。简而言之,准备好的语句使用更少的资源并且执行得更快。
2、传递给预处理语句的参数不需要引用,底层驱动会为你处理。
如果您的应用程序专门使用预准备语句,则可以确保不会发生 SQL 注入。
代码演示:
如果使用pdo预处理插入一条数据,会报错
<p>
php抓取网页数据插入数据库(php无法将中文数据写入数据库表的解决方法(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-04-11 16:28
php无法将中文数据写入数据库表的解决方法:1、将mysql使用的字符集改为utf8;2、将php文件编码使用的字符集改为utf-8;3、 将首页使用的字符编码改为utf-8。本文运行环境:windows10系统,php 7mysql 5.0、thinkpad t480电脑。在学习PHP的过程中,我们可能
php无法将中文数据写入数据库表的解决方法:1、将mysql使用的字符集改为utf8;2、将php文件编码使用的字符集改为utf-8;3、 将首页使用的字符编码改为utf-8。
本文运行环境:windows10系统,php 7&&mysql 5.0、thinkpad t480电脑。
在学习PHP的过程中,我们可能会遇到中文数据无法插入到数据表中,首页无法正确显示从数据库中获取的中文数据的情况。遇到这个问题,我们需要将mysql使用的字符集改为utf8,PHP文件编码使用的字符集改为utf-8,首页网页使用的字符码改为utf-8,这样问题就可以解决了。
具体步骤如下:
1. 运行MySQL安装目录下的MySQLInstanceConfig.exe,默认编码为utf8;
请记住选择“Best Support For Multilingualism”,并在下面的下拉列表中选择“utf8”
配置完成后,查看MySQL安装路径下my.ini文件中“default-character-set”的设置。这时候应该设置为utf8。如果没有,请将其设置为 default-character-set=utf8
2.1 创建数据库时指定utf8编码:
CREATE DATABASE database_name
CHARACTER SET “utf8”
COLLATE “utf8_general_ci”;
2.2 创建数据表时指定utf8编码:
CREATE TABLE table_name
(
Column_name datatype,
......
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
3. 设置文件编码为utf-8;
如果使用 PhpStorm,其默认文件编码为 utf-8,无需更改
4.设置页面使用的字符集为utf-8:
5.mysql_query('set names utf8'); 操作应该在对数据进行操作之前进行,然后再对数据进行查询、更新、插入等操作。
6.最后将客户端源数据使用的字符集和查询结果字符集设置为gbk:
SET character_set_client =gbk; //直接从MySQL命令行客户端插入中文数据时,存储的数据不会乱码
SET character_set_results = gbk; //MySQL命令行客户端返回的中文数据不会乱码
PS:以上内容针对 MySQL Server 5.0。在 MySQL Server 5.6 中,使用的所有默认字符编码都是 utf8
推荐学习:php培训
以上就是php无法将中文数据写入数据库表的详细内容。更多详情请关注宏旺互联网其他相关话题文章! 查看全部
php抓取网页数据插入数据库(php无法将中文数据写入数据库表的解决方法(图))
php无法将中文数据写入数据库表的解决方法:1、将mysql使用的字符集改为utf8;2、将php文件编码使用的字符集改为utf-8;3、 将首页使用的字符编码改为utf-8。本文运行环境:windows10系统,php 7mysql 5.0、thinkpad t480电脑。在学习PHP的过程中,我们可能
php无法将中文数据写入数据库表的解决方法:1、将mysql使用的字符集改为utf8;2、将php文件编码使用的字符集改为utf-8;3、 将首页使用的字符编码改为utf-8。

本文运行环境:windows10系统,php 7&&mysql 5.0、thinkpad t480电脑。
在学习PHP的过程中,我们可能会遇到中文数据无法插入到数据表中,首页无法正确显示从数据库中获取的中文数据的情况。遇到这个问题,我们需要将mysql使用的字符集改为utf8,PHP文件编码使用的字符集改为utf-8,首页网页使用的字符码改为utf-8,这样问题就可以解决了。
具体步骤如下:
1. 运行MySQL安装目录下的MySQLInstanceConfig.exe,默认编码为utf8;
请记住选择“Best Support For Multilingualism”,并在下面的下拉列表中选择“utf8”
配置完成后,查看MySQL安装路径下my.ini文件中“default-character-set”的设置。这时候应该设置为utf8。如果没有,请将其设置为 default-character-set=utf8
2.1 创建数据库时指定utf8编码:
CREATE DATABASE database_name
CHARACTER SET “utf8”
COLLATE “utf8_general_ci”;
2.2 创建数据表时指定utf8编码:
CREATE TABLE table_name
(
Column_name datatype,
......
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
3. 设置文件编码为utf-8;
如果使用 PhpStorm,其默认文件编码为 utf-8,无需更改
4.设置页面使用的字符集为utf-8:
5.mysql_query('set names utf8'); 操作应该在对数据进行操作之前进行,然后再对数据进行查询、更新、插入等操作。
6.最后将客户端源数据使用的字符集和查询结果字符集设置为gbk:
SET character_set_client =gbk; //直接从MySQL命令行客户端插入中文数据时,存储的数据不会乱码
SET character_set_results = gbk; //MySQL命令行客户端返回的中文数据不会乱码
PS:以上内容针对 MySQL Server 5.0。在 MySQL Server 5.6 中,使用的所有默认字符编码都是 utf8
推荐学习:php培训
以上就是php无法将中文数据写入数据库表的详细内容。更多详情请关注宏旺互联网其他相关话题文章!
php抓取网页数据插入数据库(我的小程序通过PHP从SQL数据库提取到数据,使用)
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-04-11 09:43
我的小程序通过 PHP 从 SQL 数据库中提取数据,使用
{{item.id}}{{item.device_num}}{{item.user_name}}{{item.user_phone}}
语句渲染数据,php获取的数据如下:
[{\"id\":\"1\",\"device_num\":\"12002120\",\"user_name\":\"li\",\"user_phone\":\"\ ",\"unit_name\":\"jijin\",\"unit_addr\":\"djsaj\",\"wechat_num\":\"hsahjh\"},{\"id\":\"2\ ",\"device_num\":\"1272677867\",\"user_name\":\"zhang\",\"user_phone\":\"1362525891\",\"unit_name\":\"yiuehhaj\", \"unit_addr\":\"heiwh\",\"wechat_num\":\"hh\"}]\r\n\r\n\r\n\r\n\r\n \r\n
调试器观察到的渲染页面数据如下
数据是空的,不知道为什么,请大家指点一下。 查看全部
php抓取网页数据插入数据库(我的小程序通过PHP从SQL数据库提取到数据,使用)
我的小程序通过 PHP 从 SQL 数据库中提取数据,使用
{{item.id}}{{item.device_num}}{{item.user_name}}{{item.user_phone}}
语句渲染数据,php获取的数据如下:
[{\"id\":\"1\",\"device_num\":\"12002120\",\"user_name\":\"li\",\"user_phone\":\"\ ",\"unit_name\":\"jijin\",\"unit_addr\":\"djsaj\",\"wechat_num\":\"hsahjh\"},{\"id\":\"2\ ",\"device_num\":\"1272677867\",\"user_name\":\"zhang\",\"user_phone\":\"1362525891\",\"unit_name\":\"yiuehhaj\", \"unit_addr\":\"heiwh\",\"wechat_num\":\"hh\"}]\r\n\r\n\r\n\r\n\r\n \r\n
调试器观察到的渲染页面数据如下
数据是空的,不知道为什么,请大家指点一下。
php抓取网页数据插入数据库( 程序模拟登录时是不能成功吗?怎么做好程序)
网站优化 • 优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2022-04-10 20:12
程序模拟登录时是不能成功吗?怎么做好程序)
$UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
curl_setopt($curl,CURLOPT_USERAGENT,$UserAgent);
注意:如果不添加这些处理,那么模拟登录将不会成功。
使用上面的程序模拟登录网站一般是成功的,但实际上还是需要考虑模拟登录网站的具体情况。例如:有的网站编码不一样,所以你抓取的页面是乱码,这时需要进行编码转换,如: $data = iconv("gb2312","utf-8",$data ) ;, 将 gbk 编码转换为 utf8 编码。还有一些网站对安全性要求比较高,比如网上银行,会把验证码放在一个内联框里,然后你需要抓取内联框的页面,然后从中提取验证码。验证码的地址,然后抓取验证码。还有一些网站(比如网银)在js代码中提交表单,并且在提交表单之前会进行一些处理,比如加密,所以如果直接提交,将无法登录成功。提交前必须做类似的处理,但是这种情况下,如果你能知道js代码中进行的具体操作,比如加密,加密算法是什么,可以和它做同样的处理,然后去提交数据,这也能成功。但是,关键来了,如果你根本不知道它执行的是什么操作,例如它执行加密,但是你不知道加密的具体算法,那么你不能执行相同的操作,并且无法模拟成功登录。这方面的一个典型案例是网上银行,它使用网银控件在js代码中处理用户提交表单之前提交的密码和验证码,但是我们根本不知道它在做什么,所以无法模拟。所以如果你认为看完这篇文章就可以模拟登录网上银行,那你就太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. . 那你太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. . 那你太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. .
对PHP相关内容比较感兴趣的读者可以查看本站专题:“”、“”、“”、“”、“”、“”、“”、“”
我希望这篇文章对你进行 PHP 编程有所帮助。 查看全部
php抓取网页数据插入数据库(
程序模拟登录时是不能成功吗?怎么做好程序)
$UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
curl_setopt($curl,CURLOPT_USERAGENT,$UserAgent);
注意:如果不添加这些处理,那么模拟登录将不会成功。
使用上面的程序模拟登录网站一般是成功的,但实际上还是需要考虑模拟登录网站的具体情况。例如:有的网站编码不一样,所以你抓取的页面是乱码,这时需要进行编码转换,如: $data = iconv("gb2312","utf-8",$data ) ;, 将 gbk 编码转换为 utf8 编码。还有一些网站对安全性要求比较高,比如网上银行,会把验证码放在一个内联框里,然后你需要抓取内联框的页面,然后从中提取验证码。验证码的地址,然后抓取验证码。还有一些网站(比如网银)在js代码中提交表单,并且在提交表单之前会进行一些处理,比如加密,所以如果直接提交,将无法登录成功。提交前必须做类似的处理,但是这种情况下,如果你能知道js代码中进行的具体操作,比如加密,加密算法是什么,可以和它做同样的处理,然后去提交数据,这也能成功。但是,关键来了,如果你根本不知道它执行的是什么操作,例如它执行加密,但是你不知道加密的具体算法,那么你不能执行相同的操作,并且无法模拟成功登录。这方面的一个典型案例是网上银行,它使用网银控件在js代码中处理用户提交表单之前提交的密码和验证码,但是我们根本不知道它在做什么,所以无法模拟。所以如果你认为看完这篇文章就可以模拟登录网上银行,那你就太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. . 那你太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. . 那你太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. .
对PHP相关内容比较感兴趣的读者可以查看本站专题:“”、“”、“”、“”、“”、“”、“”、“”
我希望这篇文章对你进行 PHP 编程有所帮助。
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
网站优化 • 优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-05-26 15:40
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS 查看全部
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
网站优化 • 优采云 发表了文章 • 0 个评论 • 83 次浏览 • 2022-05-20 18:48
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS 查看全部
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS
php抓取网页数据插入数据库phpbootstrap设计的思路很简单
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-05-16 03:12
php抓取网页数据插入数据库
phpbootstrap设计发布,用户量剧增。开始尝试做企业级服务器的设计,当时由于项目需要,对于服务器的设计和部署相当专业。后来项目停止了,开始做android,然后nodejs,后来是java。今年拿到pmc权限。在调研了大量方案后,做了个3.0版本,基于php的web服务器。服务器设计思路很简单,如下:针对java程序员和web程序员,有两种方案。
设计一个简单的phprpc通讯服务,同时服务端程序,监听socket的成功和失败,传递需要请求的参数到后端,然后调用后端的一个程序,执行请求。同时程序员监听服务端响应结果,通过ajax方式返回结果给后端。后端会把这个消息封装成一个model方法,也就是调用后端的api。后端同样把后面请求消息封装成一个model方法,这样不用动改原有的数据结构,只需要修改后端的api。
比如原来c端的就是`.json`方法返回数据,现在是`.json`,.json`就是请求参数,现在是`json`,.json`就是响应结果。这样就能避免设计这种两层php的问题,后端只需要把请求参数参数丢到后端即可。另外,web程序员主要是前端页面设计,后端程序员主要是后端封装方法,本地调用后端程序。
这样一来,可以利用php的cli自动化部署,或者自己手动编程。不过还是建议用一个phpaptana包,可以帮助更好的aptana简化过程,顺带可以切换成本地环境。 查看全部
php抓取网页数据插入数据库phpbootstrap设计的思路很简单
php抓取网页数据插入数据库
phpbootstrap设计发布,用户量剧增。开始尝试做企业级服务器的设计,当时由于项目需要,对于服务器的设计和部署相当专业。后来项目停止了,开始做android,然后nodejs,后来是java。今年拿到pmc权限。在调研了大量方案后,做了个3.0版本,基于php的web服务器。服务器设计思路很简单,如下:针对java程序员和web程序员,有两种方案。
设计一个简单的phprpc通讯服务,同时服务端程序,监听socket的成功和失败,传递需要请求的参数到后端,然后调用后端的一个程序,执行请求。同时程序员监听服务端响应结果,通过ajax方式返回结果给后端。后端会把这个消息封装成一个model方法,也就是调用后端的api。后端同样把后面请求消息封装成一个model方法,这样不用动改原有的数据结构,只需要修改后端的api。
比如原来c端的就是`.json`方法返回数据,现在是`.json`,.json`就是请求参数,现在是`json`,.json`就是响应结果。这样就能避免设计这种两层php的问题,后端只需要把请求参数参数丢到后端即可。另外,web程序员主要是前端页面设计,后端程序员主要是后端封装方法,本地调用后端程序。
这样一来,可以利用php的cli自动化部署,或者自己手动编程。不过还是建议用一个phpaptana包,可以帮助更好的aptana简化过程,顺带可以切换成本地环境。
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-05-14 02:24
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS 查看全部
php抓取网页数据插入数据库 CMS真的安全吗?洞鉴PHPCMS
什么是PHPCMS
说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
PHPCMS安全吗?
根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
2.1 SQL注入漏洞
PHPCMS框架层面分析
PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
mysql_real_escape_string,PHP手册上对这个函数的描述:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
#本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
Warning
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
(1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
(2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
(3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
private $route_config = '';
public function __construct() {
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
PHPCMS漏洞层面分析
从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
$username = isset($_POST['username']) && is_username($_POST['username']) ?
trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码
所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
function comment_list() {
$WAP = $this->wap;
$TYPE = $this->types;
$comment = pc_base::load_app_class('comment','comment');
pc_base::load_app_func('global','comment');
$typeid = intval($_GET['typeid']);
$GLOBALS['siteid'] = max($this->siteid,1);
$commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
trim(urldecode($_GET['commentid'])) : exit('参数错误');
list($modules, $contentid, $siteid) = decode_commentid($commentid);
list($module, $catid) = explode('_', $modules);
$comment_setting_db = pc_base::load_model('comment_setting_model');
$setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
$this->db->table_name = $tablename.'_data';
$rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
命令执行漏洞
命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
/**
* 将字符串转换为数组
*
* @param string $data 字符串
* @return array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
$data = trim($data);
if($data == '') return array();
if(strpos($data, 'array')===0){
@eval("\$array = $data;");
}else{
if(strpos($data, '{\\')===0) $data = stripslashes($data);
$array=json_decode($data,true);
if(strtolower(CHARSET)=='gbk'){
$array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
}
}
return $array;
}
该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
$menu = string2array($menu);
$siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
$introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
$newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
$product = $m_s_url[4] = $siteurl.'/category-product.html';
$buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
$joburl = $m_s_url[6] = $siteurl.'/category-job.html';
$joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
$guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
$contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
index.php代码执行漏洞等均是因为这个原因。
所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
其中:
猛兽放进室内:copy($_GET['src'],$_GET['dst']);
这条猛兽不安全,杀之:unlink($_GET['dst']);
炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
copy($_GET['src'],$_GET['dst']);
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
PHPCMS V9
/phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
任意文件上传漏洞、任意文件下载、任意文件读取漏洞
这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

)符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
而第二个漏洞中则因strtolower(trim
(substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
%20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
PHPCMS
php抓取网页数据插入数据库设置登录密码;抓取任意页面点击设置密码
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-05-11 08:02
php抓取网页数据插入数据库设置登录密码;网页抓取任意页面点击设置密码;网页抓取php代码设置---php文件头部加入password;根据你的php版本不同,可能网页抓取有自己的函数参数或是约定俗成的函数参数,可以手动输入或者在我的计算机里,php-h中对应的payload或者直接写进自己的php文件;获取保存网页地址,这个可以通过直接random或随机数获取保存;整个过程基本就是单纯的爬取和保存,对于新手来说还是不易实现!实现这个爬取方法相对比较简单!index.php是爬取网页文章的脚本,random的获取规则是:如果内容需要在页面当中传输,必须在爬取这个页面时设置保存,并且要设置保存位置。再php中,用pwd-d判断加密!后面的一些步骤自己在练习当中实现一下即可!。
java服务器里面封装了一个apache的postmessage类,
做php爬虫应该从http协议看起,里面可以总结出很多的姿势。不过我做php爬虫应该从php文件看起吧。
打printstatus函数,同时设置一个定时器。一直监听着。这样所有请求的回应header都有:requestheader="get"timeout=45suser-agent="mozilla/5.0(windowsnt6.1;win64;x64)applewebkit/537.36(khtml,likegecko)chrome/69.0.2480.110safari/537.36"format="postmessage"参数就是你要发送给php接口的php文件所在位置。
你点下相应的文件,就可以看到其网址。在模拟器里面可以用node-script。看看nodejs你是否用过,还是只用过php做爬虫。 查看全部
php抓取网页数据插入数据库设置登录密码;抓取任意页面点击设置密码
php抓取网页数据插入数据库设置登录密码;网页抓取任意页面点击设置密码;网页抓取php代码设置---php文件头部加入password;根据你的php版本不同,可能网页抓取有自己的函数参数或是约定俗成的函数参数,可以手动输入或者在我的计算机里,php-h中对应的payload或者直接写进自己的php文件;获取保存网页地址,这个可以通过直接random或随机数获取保存;整个过程基本就是单纯的爬取和保存,对于新手来说还是不易实现!实现这个爬取方法相对比较简单!index.php是爬取网页文章的脚本,random的获取规则是:如果内容需要在页面当中传输,必须在爬取这个页面时设置保存,并且要设置保存位置。再php中,用pwd-d判断加密!后面的一些步骤自己在练习当中实现一下即可!。
java服务器里面封装了一个apache的postmessage类,
做php爬虫应该从http协议看起,里面可以总结出很多的姿势。不过我做php爬虫应该从php文件看起吧。
打printstatus函数,同时设置一个定时器。一直监听着。这样所有请求的回应header都有:requestheader="get"timeout=45suser-agent="mozilla/5.0(windowsnt6.1;win64;x64)applewebkit/537.36(khtml,likegecko)chrome/69.0.2480.110safari/537.36"format="postmessage"参数就是你要发送给php接口的php文件所在位置。
你点下相应的文件,就可以看到其网址。在模拟器里面可以用node-script。看看nodejs你是否用过,还是只用过php做爬虫。
php抓取网页数据插入数据库(PM需遵守的数据库设计与创建规范)
网站优化 • 优采云 发表了文章 • 0 个评论 • 37 次浏览 • 2022-04-19 15:47
1.一般
为规范公司各种环境下数据库系统的设计和创建过程,提高数据库系统的开发效率,保证数据库系统的性能和安全稳定运行,特制定本规范。
该规范涉及 PM、RD、SQ 和 DBA 四个角色。数据库系统设计和创建过程中各个角色的工作内容会按照【高风险】、【强制】、【推荐】三个级别进行标注,按照优先级从高到低。
对于不符合【高风险】和【强制】两个级别的工作内容,DBA将强制其回电并要求修改。
2.适用范围
本规范定义的数据库系统包括部署在传统数据中心(物理机如Cisco UCS)和云(公有云、私有云)中的所有数据库实例。相关数据库实例参考数据库开发和创建的相关规范。
3.PM 应遵循的数据库设计和创建规范
本规范旨在帮助或指导 RD、QA、OP 等技术人员设计和开发适合在线业务的数据库。规范数据库变更及处理流程、数据库表设计、SQL编写等,为公司业务系统稳定健康运行提供保障。
3.1 Mysql设计开发规范
MySQL数据库与Oracle、SQL Server等商业数据库相比,在内核上各有优劣。我们在使用MySQL数据库进行设计开发时,需要遵循一定的规范,扬长避短。
3.1.1 命名约定
数据库对象命名规则的范围是管理平台设计和开发中涉及的表。由其他外部系统创建的表不在本规范的范围内。
表、列、序列、过程、函数等数据库对象应按照以下规则命名:
【强制】名称必须使用有意义的中英文缩写,以字母开头,不能超过32个字符。
【强制】名称必须使用小写字母,
【必选】数据库对象名由以下部分组成:范围、类型、名称实体,下划线“_”用于连接各个单词。
【必填】各个数据库对象的范围和类型的具体含义和取值,请参考各个数据库对象的命名规则。
数据库对象命名规则
【强制】数据库对象的名称不允许是数据库的保留字和关键字。
SELECT id, name, from, age FROM user not allowed
请参阅保留字和关键字的链接
选项/变量参考3.1.2 库规范
【强制】创建数据库时必须明确指定字符集,字符集只能是utf8或utf8mb4。创建数据库 SQL 示例:
创建数据库 db1 默认字符集 utf8;
3.1.3 表结构规范
【强制】创建表时,必须明确指定字符集为utf8或utf8mb4。
【强制】创建表时,必须显式指定表存储引擎类型。如果没有特殊要求,永远都是 InnoDB。当需要使用 InnoDB 以外的存储引擎时,必须经过 DBA 的审核才能在生产环境中使用。因为Innodb表支持事务、行锁、崩溃恢复、MVCC等关系型数据库的重要特性,所以是业界使用最多的MySQL存储引擎。这是大多数其他存储引擎所不具备的,因此 InnoDB 是首选。
【强制】表格必须有注释,数据字典必须从一开始就维护。类状态类型需要指定主值的含义,如“0-离线,1-在线”
【强制】中间表用于存放中间结果集,名称必须以tmp_开头。备份表用于备份或拍摄源表的快照,名称必须以 bak_ 开头。定期清理中间表和备份表。
【强制】对于超过100W行的大表,alter table必须经过DBA审核,并在业务低峰期执行。因为alter table会产生表锁,在此期间阻塞所有对表的写可能对业务有很大的影响。
【建议】关于建表时的主键:(1)强制主键为id,类型为int或bigint,为auto_increment;(2)标识的字段表中每一行的主题不应该设置为主键,建议设置其他字段如user_id、order_id等,并建立唯一键索引。因为如果设置为主键和主键值随机插入,会导致innodb内部分页和大量随机I/O,性能下降。
【建议】核心表(如用户表、钱相关表)必须要有行数据的创建时间字段create_time和最后更新时间字段update_time,方便排查问题。
【建议】建议将表中的blob、text等大字段垂直拆分到其他表中,仅在需要读取这些对象时才选择。
【建议】反范式设计:经常需要join查询的字段的冗余副本放在其他表中。比如user_account、user_login_log等表中user_name属性是多余的,减少了join查询。
3.1.4 字段说明
【建议】表中所有字段必须为NOT NULL属性,商家可根据需要定义DEFAULT值。因为使用NULL值会导致每行额外存储空间、容易出错的数据迁移、聚合函数计算结果偏差等问题。如果不保证插入时一定有值,定义时使用默认值''或0。
使用 NUMBER 类型时,必须指定长度。准确度和密度取自NUMBER,保证数据一致性
表中字段的命名长度不应超过 30 个字节
【推荐】表中自增列(auto_increment属性)推荐使用bigint类型。因为unsigned int的存储范围是-2147483648~2147483647(约21亿),溢出后会报错。
【推荐】对于业务中选择性较少的状态、类型等字段,建议使用tinytint或smallint,以节省存储空间。
【建议】业务中IP地址字段建议使用int类型,不建议使用char(15)。因为int只占4个字节,可以使用以下函数相互转换, 而 char(15) 至少占用 15 个字节。一旦表数据行数达到 1 亿,就需要使用更多的 1.1G 存储空间。
SQL: 选择 inet_aton('192.168.2.12'); 选择 inet_ntoa(3232236044);
PHP: ip2long('192.168.2.12'); long2ip(3530427185);
【推荐】不推荐使用enum和set。因为它们浪费空间,而且枚举值是硬编码的,不方便更改。建议使用 Tinyint 或 smallint。
【推荐】不推荐blob、text等类型。它们都浪费硬盘和内存空间。加载表数据时,会将大字段读入内存,浪费内存空间,影响系统性能。是否真的需要这么大的字段,建议与PM和RD沟通。在 Innodb 中,当一行记录超过 8098 字节时,将选择记录中最长的字段,并将其中的 768 字节放在原创页中,其余字段将放在溢出页中。不幸的是,在紧凑行格式中,原创页面和溢出页面都被加载了。
【建议】存钱的字段,推荐使用int,终端乘以100除以100访问。因为 int 占用 4 个字节,double 占用 8 个字节,所以浪费空间。
【建议】尽量使用varchar存储文本数据。因为varchar是变长存储,所以比char节省空间。MySQL服务器层规定一行中的所有文本最多可以存储65535字节,所以utf8字符集中最多可以存储21844个字符,会自动转换为mediumtext字段。而text最多可以存储21844个utf8字符集,mediumtext最多可以存储2^24/3个字符,longtext最多可以存储2^32个字符。一般推荐使用varchar类型,字符数不要超过2700。 查看全部
php抓取网页数据插入数据库(PM需遵守的数据库设计与创建规范)
1.一般
为规范公司各种环境下数据库系统的设计和创建过程,提高数据库系统的开发效率,保证数据库系统的性能和安全稳定运行,特制定本规范。
该规范涉及 PM、RD、SQ 和 DBA 四个角色。数据库系统设计和创建过程中各个角色的工作内容会按照【高风险】、【强制】、【推荐】三个级别进行标注,按照优先级从高到低。
对于不符合【高风险】和【强制】两个级别的工作内容,DBA将强制其回电并要求修改。
2.适用范围
本规范定义的数据库系统包括部署在传统数据中心(物理机如Cisco UCS)和云(公有云、私有云)中的所有数据库实例。相关数据库实例参考数据库开发和创建的相关规范。
3.PM 应遵循的数据库设计和创建规范
本规范旨在帮助或指导 RD、QA、OP 等技术人员设计和开发适合在线业务的数据库。规范数据库变更及处理流程、数据库表设计、SQL编写等,为公司业务系统稳定健康运行提供保障。
3.1 Mysql设计开发规范
MySQL数据库与Oracle、SQL Server等商业数据库相比,在内核上各有优劣。我们在使用MySQL数据库进行设计开发时,需要遵循一定的规范,扬长避短。
3.1.1 命名约定
数据库对象命名规则的范围是管理平台设计和开发中涉及的表。由其他外部系统创建的表不在本规范的范围内。
表、列、序列、过程、函数等数据库对象应按照以下规则命名:
【强制】名称必须使用有意义的中英文缩写,以字母开头,不能超过32个字符。
【强制】名称必须使用小写字母,
【必选】数据库对象名由以下部分组成:范围、类型、名称实体,下划线“_”用于连接各个单词。
【必填】各个数据库对象的范围和类型的具体含义和取值,请参考各个数据库对象的命名规则。
数据库对象命名规则
【强制】数据库对象的名称不允许是数据库的保留字和关键字。
SELECT id, name, from, age FROM user not allowed
请参阅保留字和关键字的链接
选项/变量参考3.1.2 库规范
【强制】创建数据库时必须明确指定字符集,字符集只能是utf8或utf8mb4。创建数据库 SQL 示例:
创建数据库 db1 默认字符集 utf8;
3.1.3 表结构规范
【强制】创建表时,必须明确指定字符集为utf8或utf8mb4。
【强制】创建表时,必须显式指定表存储引擎类型。如果没有特殊要求,永远都是 InnoDB。当需要使用 InnoDB 以外的存储引擎时,必须经过 DBA 的审核才能在生产环境中使用。因为Innodb表支持事务、行锁、崩溃恢复、MVCC等关系型数据库的重要特性,所以是业界使用最多的MySQL存储引擎。这是大多数其他存储引擎所不具备的,因此 InnoDB 是首选。
【强制】表格必须有注释,数据字典必须从一开始就维护。类状态类型需要指定主值的含义,如“0-离线,1-在线”
【强制】中间表用于存放中间结果集,名称必须以tmp_开头。备份表用于备份或拍摄源表的快照,名称必须以 bak_ 开头。定期清理中间表和备份表。
【强制】对于超过100W行的大表,alter table必须经过DBA审核,并在业务低峰期执行。因为alter table会产生表锁,在此期间阻塞所有对表的写可能对业务有很大的影响。
【建议】关于建表时的主键:(1)强制主键为id,类型为int或bigint,为auto_increment;(2)标识的字段表中每一行的主题不应该设置为主键,建议设置其他字段如user_id、order_id等,并建立唯一键索引。因为如果设置为主键和主键值随机插入,会导致innodb内部分页和大量随机I/O,性能下降。
【建议】核心表(如用户表、钱相关表)必须要有行数据的创建时间字段create_time和最后更新时间字段update_time,方便排查问题。
【建议】建议将表中的blob、text等大字段垂直拆分到其他表中,仅在需要读取这些对象时才选择。
【建议】反范式设计:经常需要join查询的字段的冗余副本放在其他表中。比如user_account、user_login_log等表中user_name属性是多余的,减少了join查询。
3.1.4 字段说明
【建议】表中所有字段必须为NOT NULL属性,商家可根据需要定义DEFAULT值。因为使用NULL值会导致每行额外存储空间、容易出错的数据迁移、聚合函数计算结果偏差等问题。如果不保证插入时一定有值,定义时使用默认值''或0。
使用 NUMBER 类型时,必须指定长度。准确度和密度取自NUMBER,保证数据一致性
表中字段的命名长度不应超过 30 个字节
【推荐】表中自增列(auto_increment属性)推荐使用bigint类型。因为unsigned int的存储范围是-2147483648~2147483647(约21亿),溢出后会报错。
【推荐】对于业务中选择性较少的状态、类型等字段,建议使用tinytint或smallint,以节省存储空间。
【建议】业务中IP地址字段建议使用int类型,不建议使用char(15)。因为int只占4个字节,可以使用以下函数相互转换, 而 char(15) 至少占用 15 个字节。一旦表数据行数达到 1 亿,就需要使用更多的 1.1G 存储空间。
SQL: 选择 inet_aton('192.168.2.12'); 选择 inet_ntoa(3232236044);
PHP: ip2long('192.168.2.12'); long2ip(3530427185);
【推荐】不推荐使用enum和set。因为它们浪费空间,而且枚举值是硬编码的,不方便更改。建议使用 Tinyint 或 smallint。
【推荐】不推荐blob、text等类型。它们都浪费硬盘和内存空间。加载表数据时,会将大字段读入内存,浪费内存空间,影响系统性能。是否真的需要这么大的字段,建议与PM和RD沟通。在 Innodb 中,当一行记录超过 8098 字节时,将选择记录中最长的字段,并将其中的 768 字节放在原创页中,其余字段将放在溢出页中。不幸的是,在紧凑行格式中,原创页面和溢出页面都被加载了。
【建议】存钱的字段,推荐使用int,终端乘以100除以100访问。因为 int 占用 4 个字节,double 占用 8 个字节,所以浪费空间。
【建议】尽量使用varchar存储文本数据。因为varchar是变长存储,所以比char节省空间。MySQL服务器层规定一行中的所有文本最多可以存储65535字节,所以utf8字符集中最多可以存储21844个字符,会自动转换为mediumtext字段。而text最多可以存储21844个utf8字符集,mediumtext最多可以存储2^24/3个字符,longtext最多可以存储2^32个字符。一般推荐使用varchar类型,字符数不要超过2700。
php抓取网页数据插入数据库(e.World开发的PHP代码自动生成工具-PHPMaker中文版)
网站优化 • 优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2022-04-18 23:23
PHPMaker中文版是e.World Technology开发的PHP代码自动生成工具。PHPMaker中文版是一款在Windows平台上运行的基于MYSQL数据库自动生成PHP脚本的软件。使用生成的PHP代码,用户可以通过WEB页面浏览、修改、查询、增删数据库中的记录。使用该软件,用户只需几个步骤即可获得完整的 PHP 代码。
基本介绍
PHP代码自动生成工具,一款运行在Windows平台上的基于MYSQL数据库自动生成PHP脚本的软件。使用生成的PHP代码,可以通过WEB页面浏览、修改、查询、增删数据库中的记录。使用它,您只需几个步骤即可获得完整的 PHP 代码。生成的代码清晰易懂,方便开发者在此基础上进行开发。
软件功能
PHPMaker 生成数据库辅助,生成数据库辅助包括当前或其他项目,简单访问数据库和检索数据
PHPMaker中文版使用handlebars.js——typeahead.js的自定义模板
细节记录在主视图中
在主/详细视图中将详细记录导出到 CSV
多个文件上传分隔符用于分隔,指定文件上传分隔符的文件名
使用颜色框图像
使用响应式布局
在移动中使用下拉菜单,使用按钮下拉菜单而不是按钮组以在移动模式下为数据节省更多空间 查看全部
php抓取网页数据插入数据库(e.World开发的PHP代码自动生成工具-PHPMaker中文版)
PHPMaker中文版是e.World Technology开发的PHP代码自动生成工具。PHPMaker中文版是一款在Windows平台上运行的基于MYSQL数据库自动生成PHP脚本的软件。使用生成的PHP代码,用户可以通过WEB页面浏览、修改、查询、增删数据库中的记录。使用该软件,用户只需几个步骤即可获得完整的 PHP 代码。

基本介绍
PHP代码自动生成工具,一款运行在Windows平台上的基于MYSQL数据库自动生成PHP脚本的软件。使用生成的PHP代码,可以通过WEB页面浏览、修改、查询、增删数据库中的记录。使用它,您只需几个步骤即可获得完整的 PHP 代码。生成的代码清晰易懂,方便开发者在此基础上进行开发。
软件功能
PHPMaker 生成数据库辅助,生成数据库辅助包括当前或其他项目,简单访问数据库和检索数据
PHPMaker中文版使用handlebars.js——typeahead.js的自定义模板
细节记录在主视图中
在主/详细视图中将详细记录导出到 CSV
多个文件上传分隔符用于分隔,指定文件上传分隔符的文件名
使用颜色框图像
使用响应式布局
在移动中使用下拉菜单,使用按钮下拉菜单而不是按钮组以在移动模式下为数据节省更多空间
php抓取网页数据插入数据库(教你PowerBI获取网址数据的具体操作方法(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 86 次浏览 • 2022-04-18 23:19
Power BI 是一款专业的交互式数据可视化 BI 工具。Power BI 具有内置的 Excel 电子表格、云服务、流数据和本地数据库——无论您的数据位于何处或采用何种格式,您都可以全面了解您的业务的关键指标。使用 Power BI,用户可以与主要利益相关者协作,以确保每个人都使用正确的数据。下面小编将教大家如何在Power BI中获取URL数据。我希望你会喜欢。
Power BI 如何获取 URL 数据:
从网页抓取数据时,如果数据本身以表格的形式存储在网页上,则可以通过简单的选择进行抓取。当数据不是以表格的形式,而是以列表的形式存储在网页中,并且是超链接文本时,您可以尝试power bi desktop的智能“添加表格使用示例”。
1、点击“获取数据”>“Web”,在弹出的对话框中输入网址,点击“确定”
3、接下来我们需要做的就是提供一个表格,其中收录我们需要提取的数据示例。
上面介绍的内容是关于Power BI获取URL数据的具体操作方法。不知道你有没有学过。如果你也遇到这样的问题,可以按照小编的方法自己试试。我希望它可以帮助您解决问题。谢谢 !!!更多软件教程请关注Win10传闻传送门:CWCSM.Com~~~~ 查看全部
php抓取网页数据插入数据库(教你PowerBI获取网址数据的具体操作方法(图))
Power BI 是一款专业的交互式数据可视化 BI 工具。Power BI 具有内置的 Excel 电子表格、云服务、流数据和本地数据库——无论您的数据位于何处或采用何种格式,您都可以全面了解您的业务的关键指标。使用 Power BI,用户可以与主要利益相关者协作,以确保每个人都使用正确的数据。下面小编将教大家如何在Power BI中获取URL数据。我希望你会喜欢。
Power BI 如何获取 URL 数据:
从网页抓取数据时,如果数据本身以表格的形式存储在网页上,则可以通过简单的选择进行抓取。当数据不是以表格的形式,而是以列表的形式存储在网页中,并且是超链接文本时,您可以尝试power bi desktop的智能“添加表格使用示例”。
1、点击“获取数据”>“Web”,在弹出的对话框中输入网址,点击“确定”

3、接下来我们需要做的就是提供一个表格,其中收录我们需要提取的数据示例。
上面介绍的内容是关于Power BI获取URL数据的具体操作方法。不知道你有没有学过。如果你也遇到这样的问题,可以按照小编的方法自己试试。我希望它可以帮助您解决问题。谢谢 !!!更多软件教程请关注Win10传闻传送门:CWCSM.Com~~~~
php抓取网页数据插入数据库(我编写了一个脚本来从网站上的php文件中获取数据 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2022-04-18 18:12
)
我编写了一个脚本来从 网站 上的 php 文件中获取数据。我编写了脚本,以便它仅在页面上的当前数据与上次从页面获取数据时发生更改时才输出数据。该页面确实需要身份验证,这就是我添加 PHPSESSID 的原因。这将允许查看页面。Cloudflare 已实施
访问前检查您的浏览器。
这个过程是自动的。您的浏览器将很快重定向到您请求的内容。请允许最多 5 秒...
这破坏了我的脚本,它无法从页面获取数据。我查看了 cfscrape 并且无法弄清楚如何将它实现到我当前的脚本中以使其正常工作。如果有人可以提供帮助,那就太好了!我讨厌不得不寻求帮助,但我有点需要尽快让这个工作。
#!/usr/bin/python
from time import sleep
import re
import hashlib
import urllib2
import winsound
def doMd5(data):
mdo = hashlib.md5()
mdo.update(data)
return mdo.hexdigest()
def doRequest():
try:
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
'Cookie': 'PHPSESSID=ldc1bp9mj7n4ocffvftm25te62'}
req = urllib2.Request('http://www.example.com/random/random.php', headers=head)
res = urllib2.urlopen(req)
data = res.read()
return data
except:
return "exception"
last_log = ""
while True:
data = doRequest()
if data == "exception" or data == "":
print "Exception!"
continue
new_hash = doMd5(data)
if new_hash != last_log:
print "New Data"
winsound.Beep(100, 80)
handler = open('data.html', 'a')
handler.write(data + '\n')
handler.close()
last_log = new_hash
else:
sleep(3)
print "Refreshing..."
continue 查看全部
php抓取网页数据插入数据库(我编写了一个脚本来从网站上的php文件中获取数据
)
我编写了一个脚本来从 网站 上的 php 文件中获取数据。我编写了脚本,以便它仅在页面上的当前数据与上次从页面获取数据时发生更改时才输出数据。该页面确实需要身份验证,这就是我添加 PHPSESSID 的原因。这将允许查看页面。Cloudflare 已实施
访问前检查您的浏览器。
这个过程是自动的。您的浏览器将很快重定向到您请求的内容。请允许最多 5 秒...
这破坏了我的脚本,它无法从页面获取数据。我查看了 cfscrape 并且无法弄清楚如何将它实现到我当前的脚本中以使其正常工作。如果有人可以提供帮助,那就太好了!我讨厌不得不寻求帮助,但我有点需要尽快让这个工作。
#!/usr/bin/python
from time import sleep
import re
import hashlib
import urllib2
import winsound
def doMd5(data):
mdo = hashlib.md5()
mdo.update(data)
return mdo.hexdigest()
def doRequest():
try:
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
'Cookie': 'PHPSESSID=ldc1bp9mj7n4ocffvftm25te62'}
req = urllib2.Request('http://www.example.com/random/random.php', headers=head)
res = urllib2.urlopen(req)
data = res.read()
return data
except:
return "exception"
last_log = ""
while True:
data = doRequest()
if data == "exception" or data == "":
print "Exception!"
continue
new_hash = doMd5(data)
if new_hash != last_log:
print "New Data"
winsound.Beep(100, 80)
handler = open('data.html', 'a')
handler.write(data + '\n')
handler.close()
last_log = new_hash
else:
sleep(3)
print "Refreshing..."
continue
php抓取网页数据插入数据库(php抓取网页数据插入数据库首先我们打开一个项目)
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-04-17 09:44
php抓取网页数据插入数据库首先我们打开一个项目:phpsphere.php,然后执行这段命令:www:phpsphere-i"#!/usr/bin/php-f"database:{}""host:{}""$_post[‘*’]或者www:phpsphere-i"#!/usr/bin/php-f"database:{}""host:{}""$_post然后我们在这里来看一下我们的数据:提取的数据放在了/users/xxx/.php/data/中,一个sqlite格式的存储数据库文件,而这个数据库是运行在一个网站上。
sqlite数据库_百度百科接下来我们就使用phpstorm打开命令窗口,我们从文件中取出需要的数据放到数据库。然后我们使用我们上面已经准备好的数据。$_post[‘*’]:我们命令语句中放置的‘*’就是我们需要提取的数据,我们想提取第5万6千2百7十三个数据,但是我们知道这个数据在phpserver中是可以获取到的,但是要使用phpstorm来提取,如果手动去获取这个数据,就需要修改php程序中的'cache_commit'项,直接使用这个项可能是无法获取到数据,这时我们就需要用到phpstorm命令窗口中的命令:$_post[‘*’],此时用phpstorm提取之后就可以直接在终端中使用了,那么这样我们的数据库就修改好了,接下来我们需要做的就是把我们的php脚本放在一个工程中,我把它放在:code。
如下图:这里我刚才写好的脚本放在上面工程中的repo中(repo:code/phpadober.git),然后把我们的数据库放在我们的工程文件下面,如下图:然后打开phpstorm或者是其他的编辑器我们会看到这样一个界面:接下来我们开始添加数据:databases:我们需要将我们的数据放在这个地方,因为后面接受该数据的命令是用conn命令进行传入的,如下图:第一个数据就是conn(*)文件的内容。
用$_post[‘*’]来取数据可以直接访问它获取数据。at:我们在这里将我们的数据放在这里就需要把下面这个{‘at’}注释掉,不然我们后面使用phps来搜索不到数据emails:同样我们要将数据emails放在这里types:text/json,文本文件或者是json文件都可以,json文件是存储多文件的数据库中的内容,它的type命令(json)就是我们提取出来的数据类型。
contents:我们要将获取到的数据放到这里,json文件是存储一个url,就是下面的json格式数据{“at”},但是我们不想要我们写的文件夹都存储在contents中,我们还是需要知道如何存储。tables:同样我们也需要将他们存储到这里,我们只需要知道如何放置就可以了。filenames:需要创建我们文件夹的路径,就创建。 查看全部
php抓取网页数据插入数据库(php抓取网页数据插入数据库首先我们打开一个项目)
php抓取网页数据插入数据库首先我们打开一个项目:phpsphere.php,然后执行这段命令:www:phpsphere-i"#!/usr/bin/php-f"database:{}""host:{}""$_post[‘*’]或者www:phpsphere-i"#!/usr/bin/php-f"database:{}""host:{}""$_post然后我们在这里来看一下我们的数据:提取的数据放在了/users/xxx/.php/data/中,一个sqlite格式的存储数据库文件,而这个数据库是运行在一个网站上。
sqlite数据库_百度百科接下来我们就使用phpstorm打开命令窗口,我们从文件中取出需要的数据放到数据库。然后我们使用我们上面已经准备好的数据。$_post[‘*’]:我们命令语句中放置的‘*’就是我们需要提取的数据,我们想提取第5万6千2百7十三个数据,但是我们知道这个数据在phpserver中是可以获取到的,但是要使用phpstorm来提取,如果手动去获取这个数据,就需要修改php程序中的'cache_commit'项,直接使用这个项可能是无法获取到数据,这时我们就需要用到phpstorm命令窗口中的命令:$_post[‘*’],此时用phpstorm提取之后就可以直接在终端中使用了,那么这样我们的数据库就修改好了,接下来我们需要做的就是把我们的php脚本放在一个工程中,我把它放在:code。
如下图:这里我刚才写好的脚本放在上面工程中的repo中(repo:code/phpadober.git),然后把我们的数据库放在我们的工程文件下面,如下图:然后打开phpstorm或者是其他的编辑器我们会看到这样一个界面:接下来我们开始添加数据:databases:我们需要将我们的数据放在这个地方,因为后面接受该数据的命令是用conn命令进行传入的,如下图:第一个数据就是conn(*)文件的内容。
用$_post[‘*’]来取数据可以直接访问它获取数据。at:我们在这里将我们的数据放在这里就需要把下面这个{‘at’}注释掉,不然我们后面使用phps来搜索不到数据emails:同样我们要将数据emails放在这里types:text/json,文本文件或者是json文件都可以,json文件是存储多文件的数据库中的内容,它的type命令(json)就是我们提取出来的数据类型。
contents:我们要将获取到的数据放到这里,json文件是存储一个url,就是下面的json格式数据{“at”},但是我们不想要我们写的文件夹都存储在contents中,我们还是需要知道如何存储。tables:同样我们也需要将他们存储到这里,我们只需要知道如何放置就可以了。filenames:需要创建我们文件夹的路径,就创建。
php抓取网页数据插入数据库(故需修改一下_max_filesize=10M(file提交文件大小限制))
网站优化 • 优采云 发表了文章 • 0 个评论 • 183 次浏览 • 2022-04-17 08:06
一般我们上传图片的传统方式是将图片保存在服务器的本地文件夹中。这里简单介绍一下直接将图片存入数据库的方法。
mysql 数据库提供了 Blob 类型来存储大量数据。BLOB有四种类型,可以容纳不同大小的数据。
高达 255B 的 TinyBlob
高达 65K 的 Blob
高达 16M 的 MediumBlob
LongBlob 高达 4G
需要注意的是,php配置文件本身对post表单数据的大小有限制,对文件提交的文件大小也有限制。所以需要到php.ini去修改
upload_max_filesize=10M(文件提交文件大小限制)
post_max_size=10M(表单数据大小限制)
我用php做一个简单的注册例子。
mysql表的设计(字段命名有点不规范,实际项目中需要注意字段命名规范)
数据库连接文件 conn.php
$conn = @mysql_connect('localhost' , 'userName' , 'passWord') or die(mysql_error()); //连接数据库
mysql_query('set names utf8' , $conn); //设置连接字符集
@mysql_select_db('user' , $conn) or die(mysql_error()); //连接数据表
注册表单register.html的实现(选择关键部分)
img/5.png
上传头像
请选择报研学校
中南大学
电子科技大学
上海交通大学
华南理工大学
上传图片和注册页面 register.php
至此,一个简单的图片上传到数据库的操作就完成了。
笔记:
1) php 配置文件大小限制
2) 用form上传文件时,一定要加上属性content enctype="multipart/form-data",否则使用$_FILES[ 'photo' ] [ 'tmp_name' ] 获取时会报异常文件信息(文件名不能为空...)
随后的更新读取数据库中的图像并输出它们。
未完待续,待续。 查看全部
php抓取网页数据插入数据库(故需修改一下_max_filesize=10M(file提交文件大小限制))
一般我们上传图片的传统方式是将图片保存在服务器的本地文件夹中。这里简单介绍一下直接将图片存入数据库的方法。
mysql 数据库提供了 Blob 类型来存储大量数据。BLOB有四种类型,可以容纳不同大小的数据。
高达 255B 的 TinyBlob
高达 65K 的 Blob
高达 16M 的 MediumBlob
LongBlob 高达 4G
需要注意的是,php配置文件本身对post表单数据的大小有限制,对文件提交的文件大小也有限制。所以需要到php.ini去修改
upload_max_filesize=10M(文件提交文件大小限制)
post_max_size=10M(表单数据大小限制)
我用php做一个简单的注册例子。
mysql表的设计(字段命名有点不规范,实际项目中需要注意字段命名规范)
数据库连接文件 conn.php
$conn = @mysql_connect('localhost' , 'userName' , 'passWord') or die(mysql_error()); //连接数据库
mysql_query('set names utf8' , $conn); //设置连接字符集
@mysql_select_db('user' , $conn) or die(mysql_error()); //连接数据表
注册表单register.html的实现(选择关键部分)
img/5.png
上传头像
请选择报研学校
中南大学
电子科技大学
上海交通大学
华南理工大学
上传图片和注册页面 register.php
至此,一个简单的图片上传到数据库的操作就完成了。
笔记:
1) php 配置文件大小限制
2) 用form上传文件时,一定要加上属性content enctype="multipart/form-data",否则使用$_FILES[ 'photo' ] [ 'tmp_name' ] 获取时会报异常文件信息(文件名不能为空...)
随后的更新读取数据库中的图像并输出它们。
未完待续,待续。
php抓取网页数据插入数据库(PHP给MYSQL插入新数据和更新数据方法以及实现代码 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-04-15 14:41
)
在做网站的时候,我们经常需要使用PHP向MYSQL中插入新数据或者更新MYSQL数据库中的数据。这一切都需要使用 MYSQL 语句。本节学做网站论坛介绍PHP到MYSQL中插入新数据和更新数据的方法及其实现代码。
第一种:PHP向MYSQL插入新数据
INSERT INTO 语句通常用于向 MySQL 表添加新记录:
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...);
table_name 是数据表的名称; column1, column2...是字段名; value1, value2...是插入的值。
如果你想用PHP来执行这个语句,可以这样写:
$sql = "INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)";
二:PHP更新数据到MYSQL
如果数据表有对应字段的值,如果要改变字段的值,需要用PHP更新MYSQL数据。
UPDATE 语句用于更新数据库表中的现有记录。
UPDATE table_name SET column1=value, column2=value2,...WHERE some_column=some_value
注意:注意 UPDATE 语法中的 WHERE 子句。 WHERE 子句指定需要更新哪些记录。如果你想省略 WHERE 子句,所有记录都会被更新!
第三种:自动判断字段是否有值,有值则更新,无值则插入新数据。
replace into 与 insert 类似,只是 replace into 先尝试将数据插入到表中。
需要注意的是,插入数据的表必须有主键或唯一索引。否则replace into会直接插入数据,导致表中有重复数据。
$sql = "REPLACE INTO $sqldz<br />
SET post_id = $postid,<br />
meta_key = 'baidusl',<br />
meta_value = '1'";<br />
$r = mysqli_query($conn,$sql);//执行SQL 查看全部
php抓取网页数据插入数据库(PHP给MYSQL插入新数据和更新数据方法以及实现代码
)
在做网站的时候,我们经常需要使用PHP向MYSQL中插入新数据或者更新MYSQL数据库中的数据。这一切都需要使用 MYSQL 语句。本节学做网站论坛介绍PHP到MYSQL中插入新数据和更新数据的方法及其实现代码。

第一种:PHP向MYSQL插入新数据
INSERT INTO 语句通常用于向 MySQL 表添加新记录:
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...);
table_name 是数据表的名称; column1, column2...是字段名; value1, value2...是插入的值。
如果你想用PHP来执行这个语句,可以这样写:
$sql = "INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)";
二:PHP更新数据到MYSQL
如果数据表有对应字段的值,如果要改变字段的值,需要用PHP更新MYSQL数据。
UPDATE 语句用于更新数据库表中的现有记录。
UPDATE table_name SET column1=value, column2=value2,...WHERE some_column=some_value
注意:注意 UPDATE 语法中的 WHERE 子句。 WHERE 子句指定需要更新哪些记录。如果你想省略 WHERE 子句,所有记录都会被更新!
第三种:自动判断字段是否有值,有值则更新,无值则插入新数据。
replace into 与 insert 类似,只是 replace into 先尝试将数据插入到表中。
需要注意的是,插入数据的表必须有主键或唯一索引。否则replace into会直接插入数据,导致表中有重复数据。
$sql = "REPLACE INTO $sqldz<br />
SET post_id = $postid,<br />
meta_key = 'baidusl',<br />
meta_value = '1'";<br />
$r = mysqli_query($conn,$sql);//执行SQL
php抓取网页数据插入数据库(PHP缓存机制类触发静态缓存的应用方法解析!!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-04-14 09:26
1、通用缓存技术:
数据缓存:这里所说的数据缓存是指数据库查询PHP缓存技术机制。每次访问一个页面,都会先检测对应的缓存数据是否存在。如果不存在,则连接数据库,获取数据,放入查询结果。序列化后保存到文件中,以后直接从缓存表或文件中获取相同的查询结果。
使用最广泛的例子是看Discuz的搜索功能,将结果ID缓存在一个表中,下次搜索相同关键字时先搜索缓存表。
给出一个通用的方法,当关联多个表时,生成附表中的内容并存储在主表的一个字段中,并在需要时分解数组。这样做的好处是只读取一张表,但缺点是有两个数据同步的步骤会比较多,数据库永远是瓶颈。这样做的关键是使用硬盘来提高速度。
2、 页面缓存:
每次访问一个页面,都会先检测对应的缓存页面文件是否存在。如果不存在,则连接数据库,获取数据,显示页面,同时生成缓存的页面文件,以便页面文件在下次访问时发挥作用。. (模板引擎和网上一些常见的PHP缓存机制类一般都有这个功能)
3、 时间触发缓存:
检查文件是否存在,时间戳是否小于设置的过期时间。如果文件修改时间戳大于当前时间戳减去过期时间戳,则使用缓存,否则更新缓存。
4、 内容触发缓存:
在插入数据或更新数据时强制更新 PHP 缓存机制。
5、 静态缓存:
这里所说的静态缓存是指页面的静态化,直接生成HTML或XML等文本文件,有更新时重新生成一次,适用于变化不大的页面。
以上内容为代码级方案,以下内容为服务端缓存方案,非代码级方案只能通过多方合作实现
6、 内存缓存:
Memcached 是一种高性能、分布式内存对象 PHP 缓存机制系统,用于减少数据库负载并提高动态应用程序的访问速度。
7、 php 缓冲区:
有eaccelerator,apc,phpa,xcache,这个就不说了,搜一堆,自己看看,如果知道有这种东西就OK了
8、 MYSQL 缓存:
这也算是非代码级别的,经典数据库就是这样用的,看下面的运行时间,0.09xxx等
9、 基于反向代理的网络缓存:
如Nginx、SQUID、mod_proxy(apache2及以上分为mod_proxy和mod_cache)
10、 DNS 轮询:
BIND 是一个开源的 DNS 服务器软件。这是一个大问题。自己搜一下,大家都知道有这个东西。
我知道一些大型网站,如 chinacache 会这样做。简单来说,就是多台服务器。同一个页面或文件缓存在不同的服务器上,根据南北自动解析到相关服务器。 查看全部
php抓取网页数据插入数据库(PHP缓存机制类触发静态缓存的应用方法解析!!)
1、通用缓存技术:
数据缓存:这里所说的数据缓存是指数据库查询PHP缓存技术机制。每次访问一个页面,都会先检测对应的缓存数据是否存在。如果不存在,则连接数据库,获取数据,放入查询结果。序列化后保存到文件中,以后直接从缓存表或文件中获取相同的查询结果。
使用最广泛的例子是看Discuz的搜索功能,将结果ID缓存在一个表中,下次搜索相同关键字时先搜索缓存表。
给出一个通用的方法,当关联多个表时,生成附表中的内容并存储在主表的一个字段中,并在需要时分解数组。这样做的好处是只读取一张表,但缺点是有两个数据同步的步骤会比较多,数据库永远是瓶颈。这样做的关键是使用硬盘来提高速度。
2、 页面缓存:
每次访问一个页面,都会先检测对应的缓存页面文件是否存在。如果不存在,则连接数据库,获取数据,显示页面,同时生成缓存的页面文件,以便页面文件在下次访问时发挥作用。. (模板引擎和网上一些常见的PHP缓存机制类一般都有这个功能)
3、 时间触发缓存:
检查文件是否存在,时间戳是否小于设置的过期时间。如果文件修改时间戳大于当前时间戳减去过期时间戳,则使用缓存,否则更新缓存。
4、 内容触发缓存:
在插入数据或更新数据时强制更新 PHP 缓存机制。
5、 静态缓存:
这里所说的静态缓存是指页面的静态化,直接生成HTML或XML等文本文件,有更新时重新生成一次,适用于变化不大的页面。
以上内容为代码级方案,以下内容为服务端缓存方案,非代码级方案只能通过多方合作实现
6、 内存缓存:
Memcached 是一种高性能、分布式内存对象 PHP 缓存机制系统,用于减少数据库负载并提高动态应用程序的访问速度。
7、 php 缓冲区:
有eaccelerator,apc,phpa,xcache,这个就不说了,搜一堆,自己看看,如果知道有这种东西就OK了
8、 MYSQL 缓存:
这也算是非代码级别的,经典数据库就是这样用的,看下面的运行时间,0.09xxx等
9、 基于反向代理的网络缓存:
如Nginx、SQUID、mod_proxy(apache2及以上分为mod_proxy和mod_cache)
10、 DNS 轮询:
BIND 是一个开源的 DNS 服务器软件。这是一个大问题。自己搜一下,大家都知道有这个东西。
我知道一些大型网站,如 chinacache 会这样做。简单来说,就是多台服务器。同一个页面或文件缓存在不同的服务器上,根据南北自动解析到相关服务器。
php抓取网页数据插入数据库(thinkphp插入数据库操作错误从excel读取数据插入mysql,生成sql正确)
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-04-13 08:34
thinkphp插入数据库操作错误
thinkphp从excel中读取数据插入mysql,生成的sql语句正确,可以单独执行。
$model->execute($sql),执行时,只插入第一个字符到任何字符串中。生成的sql语句是这样的:insertintotablevalues('','ABCDEF'),就不一一列举了,只是一个例子,insert单独执行成功,在thinkphp中执行,只在字符串ABCDEF中插入了一个A。在tp中打印出最后执行的sql语句也是正确的
thinkphpMySQL数据库
分享到:execute($sql),执行时,任何字符串只插入第一个字符。生成 sq...' data-pics=''>
- - - 解决方案 - - - - - - - - - -
直接执行结果一样吗?我认为它会受到数据库字段的类型和长度的限制。如果直接执行是一样的,那我得跟踪TP最后的mysql_query,检查mysql_query之前的$sql
- - - 解决方案 - - - - - - - - - -
引用: 引用: 引用:
直接执行结果一样吗?我认为它会受到数据库字段的类型和长度的限制。如果直接执行是一样的,那我得跟踪TP最后的mysql_query,检查mysql_query之前的$sql
你可以说得更详细点吗?谢谢
实际上,您应该在此处描述详细信息。
没有没有解决办法的“精神问题”,一定是某处有问题
以我的拙见,要么是TP对SQL语句的处理有问题,要么是mysql的数据结构/类型有问题。我想不出其他的可能性。
所以先尝试手动编写SQL语句,直接在mysql中执行,看看效果。现在你说插入成功了,那么插入之后的结果呢?你也想要吗?
如果手动插入结果正确,在TP框架中找到TP插入mysql语句,将此时的SQL语句打印出来,看是否和你手写的SQL语句一致。
那么最好仔细看看......
当然,可能有一些大神遇到过这种问题,可以指出原因,但在此之前,你可以试试这个找到原因 查看全部
php抓取网页数据插入数据库(thinkphp插入数据库操作错误从excel读取数据插入mysql,生成sql正确)
thinkphp插入数据库操作错误
thinkphp从excel中读取数据插入mysql,生成的sql语句正确,可以单独执行。
$model->execute($sql),执行时,只插入第一个字符到任何字符串中。生成的sql语句是这样的:insertintotablevalues('','ABCDEF'),就不一一列举了,只是一个例子,insert单独执行成功,在thinkphp中执行,只在字符串ABCDEF中插入了一个A。在tp中打印出最后执行的sql语句也是正确的
thinkphpMySQL数据库
分享到:execute($sql),执行时,任何字符串只插入第一个字符。生成 sq...' data-pics=''>
- - - 解决方案 - - - - - - - - - -
直接执行结果一样吗?我认为它会受到数据库字段的类型和长度的限制。如果直接执行是一样的,那我得跟踪TP最后的mysql_query,检查mysql_query之前的$sql
- - - 解决方案 - - - - - - - - - -
引用: 引用: 引用:
直接执行结果一样吗?我认为它会受到数据库字段的类型和长度的限制。如果直接执行是一样的,那我得跟踪TP最后的mysql_query,检查mysql_query之前的$sql
你可以说得更详细点吗?谢谢
实际上,您应该在此处描述详细信息。
没有没有解决办法的“精神问题”,一定是某处有问题
以我的拙见,要么是TP对SQL语句的处理有问题,要么是mysql的数据结构/类型有问题。我想不出其他的可能性。
所以先尝试手动编写SQL语句,直接在mysql中执行,看看效果。现在你说插入成功了,那么插入之后的结果呢?你也想要吗?
如果手动插入结果正确,在TP框架中找到TP插入mysql语句,将此时的SQL语句打印出来,看是否和你手写的SQL语句一致。
那么最好仔细看看......
当然,可能有一些大神遇到过这种问题,可以指出原因,但在此之前,你可以试试这个找到原因
php抓取网页数据插入数据库( PHP获取要删除数据库表中的数据插入新的表再原删除数据 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-04-13 08:13
PHP获取要删除数据库表中的数据插入新的表再原删除数据
)
PHP获取数据库表中的数据,插入新表,然后删除数据方法
2019-09-02 10:26老张PHP教程
在本文文章中,我们与大家分享PHP获取要删除的数据库表中的数据,插入新表,然后删除数据的详细方法和相关代码。
1、我用get做路由
(1) 控制器
public function a(Request $request){
//获取指定的id
$id = $request->id;
$rs=R::find($id);
//仓库中
$re=$rs->rfid;
//判断仓库中的是否与数据库的rf在线的是否相等
$ws= G::where('rfid','=',$re)->first();
if($ws){
return response()->json(['status'=>0,'msg'=>'不成功']);
}
//导入数据
$sql=DB::insert("insert into gs( g ,id,created_at,updated_at) values (?,?,?,?)",
[$rs->p,$rs->r,$rs->creat,$rs->up]);
// 成功删除
if($sql){
$rs->delete();
return ['status'=>1,'msg'=>'成功'];
}else{
return response()->json(['status'=>0,'msg'=>'不成功']);
}
(2) 视图
关联
(3)js 注释
图层插件
$(".change").click(function () {
var id = $(this).data("id");
if(confirm("确定xxx")){
$.ajax({
url: '/',
type: 'get',
data: {'id':id},
success: function (res) {
if (res.status == 0) {
layer.msg(res.msg);
} else {
layer.msg(res.msg, {icon: 1}, function () {
location.href = '要跳转的页面';
});
}
}
});
}
}); 查看全部
php抓取网页数据插入数据库(
PHP获取要删除数据库表中的数据插入新的表再原删除数据
)
PHP获取数据库表中的数据,插入新表,然后删除数据方法
2019-09-02 10:26老张PHP教程
在本文文章中,我们与大家分享PHP获取要删除的数据库表中的数据,插入新表,然后删除数据的详细方法和相关代码。
1、我用get做路由
(1) 控制器
public function a(Request $request){
//获取指定的id
$id = $request->id;
$rs=R::find($id);
//仓库中
$re=$rs->rfid;
//判断仓库中的是否与数据库的rf在线的是否相等
$ws= G::where('rfid','=',$re)->first();
if($ws){
return response()->json(['status'=>0,'msg'=>'不成功']);
}
//导入数据
$sql=DB::insert("insert into gs( g ,id,created_at,updated_at) values (?,?,?,?)",
[$rs->p,$rs->r,$rs->creat,$rs->up]);
// 成功删除
if($sql){
$rs->delete();
return ['status'=>1,'msg'=>'成功'];
}else{
return response()->json(['status'=>0,'msg'=>'不成功']);
}
(2) 视图
关联
(3)js 注释
图层插件
$(".change").click(function () {
var id = $(this).data("id");
if(confirm("确定xxx")){
$.ajax({
url: '/',
type: 'get',
data: {'id':id},
success: function (res) {
if (res.status == 0) {
layer.msg(res.msg);
} else {
layer.msg(res.msg, {icon: 1}, function () {
location.href = '要跳转的页面';
});
}
}
});
}
});
php抓取网页数据插入数据库(web服务器可以用三种方法来利用PHP用作一个“外壳”)
网站优化 • 优采云 发表了文章 • 0 个评论 • 118 次浏览 • 2022-04-12 09:13
//------------------------------------------------ ----
数据库永久连接
持久数据库连接是脚本完成运行时未关闭的连接。收到永久连接请求时。PHP 将检查是否已经存在相同的持久连接(之前已经打开)。如果存在,则直接使用连接;如果它不存在,将建立一个新的连接。所谓“同”连接,是指用相同的用户名和密码连接到同一台主机。
不完全了解 Web 服务器的工作和分配负载的读者可能会误解持久连接的作用。特别是,持久连接不提供在同一连接上建立“用户会话”的能力,也不提供有效建立事务的能力。事实上,严格来说,持久连接并没有提供非持久连接所不能提供的任何特殊功能。
为什么?
这与 Web 服务器的工作方式有关。Web 服务器可以使用 PHP 以三种方式生成网页。
第一种方法是使用 PHP 作为“外壳”。以这种方式运行,PHP 会为向 Web 服务器发出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程在每个请求结束时结束,因此在该线程中使用的任何资源(例如与 SQL 数据库服务器的连接)都将在线程结束时关闭。在这种情况下,使用永久连接不会改变任何东西——因为它们根本不是永久的。
第二种也是最常见的方法是使用 PHP 作为多进程 Web 服务器的模块,目前仅适用于 Apache。对于多进程服务器来说,典型的特点是有一个父进程和一组子进程协同运行,而真正生成网页的是子进程。每当客户端向父进程发出请求时,该请求就会被传递给未被其他客户端请求占用的子进程。这意味着当同一个客户端向服务器发出第二个请求时,它很可能由不同的子进程处理。开启持久连接后,后续所有请求SQL服务的页面都可以复用已建立的SQLServer连接。
最后一种方法是使用 PHP 作为多线程 Web 服务器的插件。目前 PHP4 已经支持 ISAPI、WSAPI 和 NSAPI(在 Windows 环境下),这使得 PHP 可以作为 NetscapeFastTrack (iPlanet)、微软的 Internet Information Server (IIS) 和 O'Reilly's 等多线程 Web 服务器的插件使用。网站专业版。持久连接的行为本质上与前面描述的多进程模型相同。请注意,PHP3 不支持 SAPI。
如果没有任何附加功能,使用永久连接有什么好处?
答案很简单——效率。当客户端对 SQL 服务器的连接请求非常频繁时,持久连接更有效。频繁连接请求的标准取决于许多因素。比如数据库的种类,数据库服务和web服务是否在同一台服务器上,SQL服务器如何加载负载等等。但我们至少知道,当连接请求非常频繁时,永久连接会显着提高效率。它允许每个子进程在其生命周期中只进行一次连接操作,而不是每次处理一个页面时都向 SQL 服务器发出连接请求。这意味着每个子进程都将建立自己独立的与服务器的永久连接。例如,
注意,如果永久连接的子进程数超过设置的数据库连接限制,系统会出现一些缺陷。如果数据库有 16 个同时连接的限制,并且在会话繁忙的情况下,有 17 个线程正在尝试连接,那么一个线程将无法连接。如果此时脚本中出现阻止连接关闭的错误(例如无限循环),那么数据库的 16 个连接将很快受到影响。有关如何处理废弃和空闲连接的信息,请查阅您正在使用的数据库的文档。
警告
使用持久连接时需要注意一些特殊问题。例如,在永久连接中使用数据表锁时,如果脚本因任何原因无法释放数据表锁,后续使用同一连接的脚本将被永久阻塞,需要重启httpd服务或数据库服务. 此外,在使用事务时,如果脚本在事务阻塞发生之前结束,阻塞也会影响使用同一连接的下一个脚本。在任何情况下,都可以使用 register_shutdown_function() 函数注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的是,不要在使用表锁或事务的脚本中使用持久连接,
以下是重要的总结。永久连接旨在建立公共连接的一对一分布。这意味着必须能够保证在用非持久连接替换持久连接时脚本的行为不会改变。使用永久连接(非常)可能会改变脚本的效率,但不会改变它的行为!
请参阅 fbsql_pconnect()、ibase_pconnect()、ifx_pconnect()、ingres_pconnect()、msql_pconnect()、mssql_pconnect()、mysql_pconnect()、ociplogon()、odbc_pconnect()、ora_plogon()、pfsockopen()、pg_pconnect() 和sybase_pconnect ( )。
//------------------------------------------------ -------------------------------- 查看全部
php抓取网页数据插入数据库(web服务器可以用三种方法来利用PHP用作一个“外壳”)
//------------------------------------------------ ----
数据库永久连接
持久数据库连接是脚本完成运行时未关闭的连接。收到永久连接请求时。PHP 将检查是否已经存在相同的持久连接(之前已经打开)。如果存在,则直接使用连接;如果它不存在,将建立一个新的连接。所谓“同”连接,是指用相同的用户名和密码连接到同一台主机。
不完全了解 Web 服务器的工作和分配负载的读者可能会误解持久连接的作用。特别是,持久连接不提供在同一连接上建立“用户会话”的能力,也不提供有效建立事务的能力。事实上,严格来说,持久连接并没有提供非持久连接所不能提供的任何特殊功能。
为什么?
这与 Web 服务器的工作方式有关。Web 服务器可以使用 PHP 以三种方式生成网页。
第一种方法是使用 PHP 作为“外壳”。以这种方式运行,PHP 会为向 Web 服务器发出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程在每个请求结束时结束,因此在该线程中使用的任何资源(例如与 SQL 数据库服务器的连接)都将在线程结束时关闭。在这种情况下,使用永久连接不会改变任何东西——因为它们根本不是永久的。
第二种也是最常见的方法是使用 PHP 作为多进程 Web 服务器的模块,目前仅适用于 Apache。对于多进程服务器来说,典型的特点是有一个父进程和一组子进程协同运行,而真正生成网页的是子进程。每当客户端向父进程发出请求时,该请求就会被传递给未被其他客户端请求占用的子进程。这意味着当同一个客户端向服务器发出第二个请求时,它很可能由不同的子进程处理。开启持久连接后,后续所有请求SQL服务的页面都可以复用已建立的SQLServer连接。
最后一种方法是使用 PHP 作为多线程 Web 服务器的插件。目前 PHP4 已经支持 ISAPI、WSAPI 和 NSAPI(在 Windows 环境下),这使得 PHP 可以作为 NetscapeFastTrack (iPlanet)、微软的 Internet Information Server (IIS) 和 O'Reilly's 等多线程 Web 服务器的插件使用。网站专业版。持久连接的行为本质上与前面描述的多进程模型相同。请注意,PHP3 不支持 SAPI。
如果没有任何附加功能,使用永久连接有什么好处?
答案很简单——效率。当客户端对 SQL 服务器的连接请求非常频繁时,持久连接更有效。频繁连接请求的标准取决于许多因素。比如数据库的种类,数据库服务和web服务是否在同一台服务器上,SQL服务器如何加载负载等等。但我们至少知道,当连接请求非常频繁时,永久连接会显着提高效率。它允许每个子进程在其生命周期中只进行一次连接操作,而不是每次处理一个页面时都向 SQL 服务器发出连接请求。这意味着每个子进程都将建立自己独立的与服务器的永久连接。例如,
注意,如果永久连接的子进程数超过设置的数据库连接限制,系统会出现一些缺陷。如果数据库有 16 个同时连接的限制,并且在会话繁忙的情况下,有 17 个线程正在尝试连接,那么一个线程将无法连接。如果此时脚本中出现阻止连接关闭的错误(例如无限循环),那么数据库的 16 个连接将很快受到影响。有关如何处理废弃和空闲连接的信息,请查阅您正在使用的数据库的文档。
警告
使用持久连接时需要注意一些特殊问题。例如,在永久连接中使用数据表锁时,如果脚本因任何原因无法释放数据表锁,后续使用同一连接的脚本将被永久阻塞,需要重启httpd服务或数据库服务. 此外,在使用事务时,如果脚本在事务阻塞发生之前结束,阻塞也会影响使用同一连接的下一个脚本。在任何情况下,都可以使用 register_shutdown_function() 函数注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的是,不要在使用表锁或事务的脚本中使用持久连接,
以下是重要的总结。永久连接旨在建立公共连接的一对一分布。这意味着必须能够保证在用非持久连接替换持久连接时脚本的行为不会改变。使用永久连接(非常)可能会改变脚本的效率,但不会改变它的行为!
请参阅 fbsql_pconnect()、ibase_pconnect()、ifx_pconnect()、ingres_pconnect()、msql_pconnect()、mssql_pconnect()、mysql_pconnect()、ociplogon()、odbc_pconnect()、ora_plogon()、pfsockopen()、pg_pconnect() 和sybase_pconnect ( )。
//------------------------------------------------ --------------------------------
php抓取网页数据插入数据库(PHP访问数据库使用什么数据库语句的参数不需要使用?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-04-11 16:32
PDO(PHP 数据库对象)扩展为 PHP 访问数据库定义了一个轻量级且一致的接口。它提供了一个数据访问抽象层,因此无论使用什么数据库,都可以通过一致的功能执行查询和检索。数据。数据库操作更安全、更高效!
PDO 为 PHP 定义了一个轻量级且一致的接口来访问各种数据库。无论是什么数据库,都可以以一致的方式执行查询和获取数据,而无需考虑不同数据库之间的差异,大大简化了数据库操作。使用PDO可以支持mysql、postgresql、oracle、mssql等数据库。
什么是预处理?
成熟的数据库支持Prepared Statements的概念。
这些是什么?您可以将它们视为要执行的 SQL 语句的编译模板,可以使用不同的变量参数进行自定义。
准备好的语句有两个主要优点:
1、查询只需要解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好 (Prepared) 时,数据库会分析、编译和优化其执行查询的计划。
对于复杂的查询,如果你必须多次重复不同参数但结构相同的查询,这个过程会花费很多时间,并使你的应用程序变慢。
通过使用准备好的语句,您可以避免重复分析、编译和优化。简而言之,准备好的语句使用更少的资源并且执行得更快。
2、传递给预处理语句的参数不需要引用,底层驱动会为你处理。
如果您的应用程序专门使用预准备语句,则可以确保不会发生 SQL 注入。
代码演示:
如果使用pdo预处理插入一条数据,会报错
<p> 查看全部
php抓取网页数据插入数据库(PHP访问数据库使用什么数据库语句的参数不需要使用?)
PDO(PHP 数据库对象)扩展为 PHP 访问数据库定义了一个轻量级且一致的接口。它提供了一个数据访问抽象层,因此无论使用什么数据库,都可以通过一致的功能执行查询和检索。数据。数据库操作更安全、更高效!
PDO 为 PHP 定义了一个轻量级且一致的接口来访问各种数据库。无论是什么数据库,都可以以一致的方式执行查询和获取数据,而无需考虑不同数据库之间的差异,大大简化了数据库操作。使用PDO可以支持mysql、postgresql、oracle、mssql等数据库。
什么是预处理?
成熟的数据库支持Prepared Statements的概念。
这些是什么?您可以将它们视为要执行的 SQL 语句的编译模板,可以使用不同的变量参数进行自定义。
准备好的语句有两个主要优点:
1、查询只需要解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好 (Prepared) 时,数据库会分析、编译和优化其执行查询的计划。
对于复杂的查询,如果你必须多次重复不同参数但结构相同的查询,这个过程会花费很多时间,并使你的应用程序变慢。
通过使用准备好的语句,您可以避免重复分析、编译和优化。简而言之,准备好的语句使用更少的资源并且执行得更快。
2、传递给预处理语句的参数不需要引用,底层驱动会为你处理。
如果您的应用程序专门使用预准备语句,则可以确保不会发生 SQL 注入。
代码演示:
如果使用pdo预处理插入一条数据,会报错
<p>
php抓取网页数据插入数据库(php无法将中文数据写入数据库表的解决方法(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-04-11 16:28
php无法将中文数据写入数据库表的解决方法:1、将mysql使用的字符集改为utf8;2、将php文件编码使用的字符集改为utf-8;3、 将首页使用的字符编码改为utf-8。本文运行环境:windows10系统,php 7mysql 5.0、thinkpad t480电脑。在学习PHP的过程中,我们可能
php无法将中文数据写入数据库表的解决方法:1、将mysql使用的字符集改为utf8;2、将php文件编码使用的字符集改为utf-8;3、 将首页使用的字符编码改为utf-8。
本文运行环境:windows10系统,php 7&&mysql 5.0、thinkpad t480电脑。
在学习PHP的过程中,我们可能会遇到中文数据无法插入到数据表中,首页无法正确显示从数据库中获取的中文数据的情况。遇到这个问题,我们需要将mysql使用的字符集改为utf8,PHP文件编码使用的字符集改为utf-8,首页网页使用的字符码改为utf-8,这样问题就可以解决了。
具体步骤如下:
1. 运行MySQL安装目录下的MySQLInstanceConfig.exe,默认编码为utf8;
请记住选择“Best Support For Multilingualism”,并在下面的下拉列表中选择“utf8”
配置完成后,查看MySQL安装路径下my.ini文件中“default-character-set”的设置。这时候应该设置为utf8。如果没有,请将其设置为 default-character-set=utf8
2.1 创建数据库时指定utf8编码:
CREATE DATABASE database_name
CHARACTER SET “utf8”
COLLATE “utf8_general_ci”;
2.2 创建数据表时指定utf8编码:
CREATE TABLE table_name
(
Column_name datatype,
......
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
3. 设置文件编码为utf-8;
如果使用 PhpStorm,其默认文件编码为 utf-8,无需更改
4.设置页面使用的字符集为utf-8:
5.mysql_query('set names utf8'); 操作应该在对数据进行操作之前进行,然后再对数据进行查询、更新、插入等操作。
6.最后将客户端源数据使用的字符集和查询结果字符集设置为gbk:
SET character_set_client =gbk; //直接从MySQL命令行客户端插入中文数据时,存储的数据不会乱码
SET character_set_results = gbk; //MySQL命令行客户端返回的中文数据不会乱码
PS:以上内容针对 MySQL Server 5.0。在 MySQL Server 5.6 中,使用的所有默认字符编码都是 utf8
推荐学习:php培训
以上就是php无法将中文数据写入数据库表的详细内容。更多详情请关注宏旺互联网其他相关话题文章! 查看全部
php抓取网页数据插入数据库(php无法将中文数据写入数据库表的解决方法(图))
php无法将中文数据写入数据库表的解决方法:1、将mysql使用的字符集改为utf8;2、将php文件编码使用的字符集改为utf-8;3、 将首页使用的字符编码改为utf-8。本文运行环境:windows10系统,php 7mysql 5.0、thinkpad t480电脑。在学习PHP的过程中,我们可能
php无法将中文数据写入数据库表的解决方法:1、将mysql使用的字符集改为utf8;2、将php文件编码使用的字符集改为utf-8;3、 将首页使用的字符编码改为utf-8。

本文运行环境:windows10系统,php 7&&mysql 5.0、thinkpad t480电脑。
在学习PHP的过程中,我们可能会遇到中文数据无法插入到数据表中,首页无法正确显示从数据库中获取的中文数据的情况。遇到这个问题,我们需要将mysql使用的字符集改为utf8,PHP文件编码使用的字符集改为utf-8,首页网页使用的字符码改为utf-8,这样问题就可以解决了。
具体步骤如下:
1. 运行MySQL安装目录下的MySQLInstanceConfig.exe,默认编码为utf8;
请记住选择“Best Support For Multilingualism”,并在下面的下拉列表中选择“utf8”
配置完成后,查看MySQL安装路径下my.ini文件中“default-character-set”的设置。这时候应该设置为utf8。如果没有,请将其设置为 default-character-set=utf8
2.1 创建数据库时指定utf8编码:
CREATE DATABASE database_name
CHARACTER SET “utf8”
COLLATE “utf8_general_ci”;
2.2 创建数据表时指定utf8编码:
CREATE TABLE table_name
(
Column_name datatype,
......
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
3. 设置文件编码为utf-8;
如果使用 PhpStorm,其默认文件编码为 utf-8,无需更改
4.设置页面使用的字符集为utf-8:
5.mysql_query('set names utf8'); 操作应该在对数据进行操作之前进行,然后再对数据进行查询、更新、插入等操作。
6.最后将客户端源数据使用的字符集和查询结果字符集设置为gbk:
SET character_set_client =gbk; //直接从MySQL命令行客户端插入中文数据时,存储的数据不会乱码
SET character_set_results = gbk; //MySQL命令行客户端返回的中文数据不会乱码
PS:以上内容针对 MySQL Server 5.0。在 MySQL Server 5.6 中,使用的所有默认字符编码都是 utf8
推荐学习:php培训
以上就是php无法将中文数据写入数据库表的详细内容。更多详情请关注宏旺互联网其他相关话题文章!
php抓取网页数据插入数据库(我的小程序通过PHP从SQL数据库提取到数据,使用)
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-04-11 09:43
我的小程序通过 PHP 从 SQL 数据库中提取数据,使用
{{item.id}}{{item.device_num}}{{item.user_name}}{{item.user_phone}}
语句渲染数据,php获取的数据如下:
[{\"id\":\"1\",\"device_num\":\"12002120\",\"user_name\":\"li\",\"user_phone\":\"\ ",\"unit_name\":\"jijin\",\"unit_addr\":\"djsaj\",\"wechat_num\":\"hsahjh\"},{\"id\":\"2\ ",\"device_num\":\"1272677867\",\"user_name\":\"zhang\",\"user_phone\":\"1362525891\",\"unit_name\":\"yiuehhaj\", \"unit_addr\":\"heiwh\",\"wechat_num\":\"hh\"}]\r\n\r\n\r\n\r\n\r\n \r\n
调试器观察到的渲染页面数据如下
数据是空的,不知道为什么,请大家指点一下。 查看全部
php抓取网页数据插入数据库(我的小程序通过PHP从SQL数据库提取到数据,使用)
我的小程序通过 PHP 从 SQL 数据库中提取数据,使用
{{item.id}}{{item.device_num}}{{item.user_name}}{{item.user_phone}}
语句渲染数据,php获取的数据如下:
[{\"id\":\"1\",\"device_num\":\"12002120\",\"user_name\":\"li\",\"user_phone\":\"\ ",\"unit_name\":\"jijin\",\"unit_addr\":\"djsaj\",\"wechat_num\":\"hsahjh\"},{\"id\":\"2\ ",\"device_num\":\"1272677867\",\"user_name\":\"zhang\",\"user_phone\":\"1362525891\",\"unit_name\":\"yiuehhaj\", \"unit_addr\":\"heiwh\",\"wechat_num\":\"hh\"}]\r\n\r\n\r\n\r\n\r\n \r\n
调试器观察到的渲染页面数据如下
数据是空的,不知道为什么,请大家指点一下。
php抓取网页数据插入数据库( 程序模拟登录时是不能成功吗?怎么做好程序)
网站优化 • 优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2022-04-10 20:12
程序模拟登录时是不能成功吗?怎么做好程序)
$UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
curl_setopt($curl,CURLOPT_USERAGENT,$UserAgent);
注意:如果不添加这些处理,那么模拟登录将不会成功。
使用上面的程序模拟登录网站一般是成功的,但实际上还是需要考虑模拟登录网站的具体情况。例如:有的网站编码不一样,所以你抓取的页面是乱码,这时需要进行编码转换,如: $data = iconv("gb2312","utf-8",$data ) ;, 将 gbk 编码转换为 utf8 编码。还有一些网站对安全性要求比较高,比如网上银行,会把验证码放在一个内联框里,然后你需要抓取内联框的页面,然后从中提取验证码。验证码的地址,然后抓取验证码。还有一些网站(比如网银)在js代码中提交表单,并且在提交表单之前会进行一些处理,比如加密,所以如果直接提交,将无法登录成功。提交前必须做类似的处理,但是这种情况下,如果你能知道js代码中进行的具体操作,比如加密,加密算法是什么,可以和它做同样的处理,然后去提交数据,这也能成功。但是,关键来了,如果你根本不知道它执行的是什么操作,例如它执行加密,但是你不知道加密的具体算法,那么你不能执行相同的操作,并且无法模拟成功登录。这方面的一个典型案例是网上银行,它使用网银控件在js代码中处理用户提交表单之前提交的密码和验证码,但是我们根本不知道它在做什么,所以无法模拟。所以如果你认为看完这篇文章就可以模拟登录网上银行,那你就太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. . 那你太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. . 那你太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. .
对PHP相关内容比较感兴趣的读者可以查看本站专题:“”、“”、“”、“”、“”、“”、“”、“”
我希望这篇文章对你进行 PHP 编程有所帮助。 查看全部
php抓取网页数据插入数据库(
程序模拟登录时是不能成功吗?怎么做好程序)
$UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
curl_setopt($curl,CURLOPT_USERAGENT,$UserAgent);
注意:如果不添加这些处理,那么模拟登录将不会成功。
使用上面的程序模拟登录网站一般是成功的,但实际上还是需要考虑模拟登录网站的具体情况。例如:有的网站编码不一样,所以你抓取的页面是乱码,这时需要进行编码转换,如: $data = iconv("gb2312","utf-8",$data ) ;, 将 gbk 编码转换为 utf8 编码。还有一些网站对安全性要求比较高,比如网上银行,会把验证码放在一个内联框里,然后你需要抓取内联框的页面,然后从中提取验证码。验证码的地址,然后抓取验证码。还有一些网站(比如网银)在js代码中提交表单,并且在提交表单之前会进行一些处理,比如加密,所以如果直接提交,将无法登录成功。提交前必须做类似的处理,但是这种情况下,如果你能知道js代码中进行的具体操作,比如加密,加密算法是什么,可以和它做同样的处理,然后去提交数据,这也能成功。但是,关键来了,如果你根本不知道它执行的是什么操作,例如它执行加密,但是你不知道加密的具体算法,那么你不能执行相同的操作,并且无法模拟成功登录。这方面的一个典型案例是网上银行,它使用网银控件在js代码中处理用户提交表单之前提交的密码和验证码,但是我们根本不知道它在做什么,所以无法模拟。所以如果你认为看完这篇文章就可以模拟登录网上银行,那你就太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. . 那你太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. . 那你太天真了。其他银行的网站能这么容易被你模拟吗?当然,如果你能破解网上银行的控制,那就另当别论了。说了这么多,为什么会感慨这么深,因为遇到了这个问题,不说,我会哭的太多。. .
对PHP相关内容比较感兴趣的读者可以查看本站专题:“”、“”、“”、“”、“”、“”、“”、“”
我希望这篇文章对你进行 PHP 编程有所帮助。