• 基于PHP实现CMS识别


    最近正在开发一款基于PHP实现的Web安全检测平台,写到了CMS识别这一功能,便写一篇文章总结一下。
    首先需要梳理的是CMS识别的几种方法:
    1.网页源代码特征:例如源代码中包含CMS的名称或是某种特定关键词。
     
    2.路径/文件特征:例如DeDe织梦系统存在/dede/路径与advancedsearch.php文件。
    3.版权信息特征:在网页底部的版权信息中往往会包含CMS信息,这种特征在我们接下来的编程中可以包含在"网页源代码特征"中。
    4.robots.txt特征:部分CMS的robots.txt文件中会包含CMS信息,例如Discuz论坛系统。
    除了这四种特征以外,还有其他的一些特征这里就不多阐述了,我们接下来就要围绕这4种特征来实现基于PHP的CMS识别功能。
    在开始编程前,我们先根据4种特征来设计一下各自识别CMS的编程思路:
     
    1.网页源代码特征:发送请求获取网页源码 -> 利用正则匹配关键词
    2.路径/文件特征:发送请求获取HTTP状态码 -> 根据HTTP状态码判断路径/文件是否存在
    3.版权信息特征:发送请求获取网页源码 -> 利用正则匹配关键词(与网页源代码特征编程思路相同)
    4.robots.txt特征: 发送请求获取HTTP状态码 -> 根据HTTP状态码判断robots.txt文件是否存在 -> 若存在则使用正则匹配关键词
     
    以上便是4种特征的编程实现思路,同时,为了保证识别的准确性,我们需要对一个CMS添加多种识别方式,防止漏报或误报:
    例如判断DeDe织梦系统时,我们除了可以依据robots.txt文件存在"Disallow: /plus/"这一关键词判断外,还可以检测源代码中是否存在"dedeajax"的关键词,只要满足以上任一条件即可判定为DeDe织梦系统。
    下面开始编写我们的主要几个功能:
     
    //获取HTTP状态码函数:
        function requests_code($url){
            $curl = curl_init();
            $header = array("Connection: Keep-Alive","Accept: text/html, application/xhtml+xml, */*", "Pragma: no-cache", "Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3","User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_HEADER, 1);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
            curl_setopt($curl,CURLOPT_NOBODY,true);
            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_exec($curl);
            $code = curl_getinfo($curl,CURLINFO_HTTP_CODE);
            curl_close($curl);
            return $code;
        }
     
    //获取网页源代码正则匹配函数:
        function contents_match($url, $regex){
            $curl = curl_init();
            $header = array("Connection: Keep-Alive","Accept: text/html, application/xhtml+xml, */*", "Pragma: no-cache", "Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3","User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
            curl_setopt($curl, CURLOPT_URL,$url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
            $data = curl_exec($curl);
            curl_close ($curl);
            if(preg_match($regex, $data)){
                return True;
            }else{
                return False;
            }
        }


    以上两个功能我们使用自定义函数实现能使代码更加简介易懂,接下来我们开始编写不同CMS的识别策略:

     
        //Discuz论坛系统网站特征
        function dz($url){
            $regex = "/Discuz/i";
            if(contents_match($url, $regex)){  //网页源代码特征
                return True;
            }elseif(contents_match($url.'/robots.txt', $regex)){  //robots.txt文件特征
                return True;
            }else{
                return False;
            }
        }
     
        //ECshop网店商城系统网站特征
        function ecshop($url){
            $contents_regex = "/process_request/";
            $path = "/themes/default/images/logo.gif";
            if(contents_match($url, $contents_regex)){  //网页源代码特征
                return True;
            }else if(requests_code($url.$path) == 200){  //robots.txt文件特征
                return True;
            }else{
                return False;
            }
        }
    这里就展示两种CMS的识别方式,如果对更多CMS识别有兴趣可以联系笔者一起交流。这样我们就实现了PHP识别CMS的核心程序,接下来只需要调用各个函数使用if语句判断即可,加上百万前端工程师的美化,文末展示一下最终的效果:

  • 相关阅读:
    CloudFoundry 中的GoRouter性能測试
    Android-SharedPreferences
    Oracle 闪回表实验
    使用Jfree实现吧条形图,java代码
    ZOJ Monthly, October 2010 ABEFI
    熟知CDN
    看,2015阿里巴巴视觉设计人员面临的问题招收学校
    于win7使用虚拟磁盘隐藏文件
    2015广东工业大学ACM学校巡回赛 I 游戏高手 (如压力dp)
    spring mvc 错误摘要--。位。
  • 原文地址:https://www.cnblogs.com/yesec/p/12387685.html
Copyright © 2020-2023  润新知