simple_html_dom类做爬虫Demo

<?php

include_once("simple_html_dom.php");
$url = 'http://www.0535code.com';
$html=file_get_html($url);//要抓取的站点网址

$tmp=array();//保存一级url数组
foreach($html->find('a') as $e)
{
$f=$e->href;
if($f[0]=='/')$f=$url.$f;//拼接网址
if(stripos($f,"0535code")==FALSE)continue;//判断是否为当前站点
echo $f . '<br>';
$tmp[$cun++]=$f; //保存一级url数组
}

foreach($tmp as $r) //循环一级url数组
{
$html2=file_get_html($r); //获取url内层url
foreach($html2->find('a') as $a)
{
$u=$a->href;
if($u[0]=='/')$u=$url.$u;
if(stripos($u,"0535code")==FALSE)continue;
echo $u.'<br>';
}
$html2=null;
}
?>

实现万网二级域名绑定二级目录

之前用万网主机想用二级域名绑定二级目录,开始想了两种个方法,一种是直接跳转目录,这种情况下会造成调用的文件不加载,因为不在同一级目录下,但是修改为绝对路径又觉得不合适,这不应该是最好的解决方案,于是放弃了这种做法,还有另一种做法就是301重定向,这种到是没啥问题,不过重定向的是二级域名定向到二级目录,与开始想的需求不吻合了,之后这事就不了了之了,今天实在需要这个功能,仔细研究了下,还是要用第一种方法,可以不用网址绝对路径,用虚拟目录的相对绝对路径,可能有点别扭,不过就是这么实现的。贴代码:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(wap.)?URL$
RewriteRule ^(/)?$ wap/index.html [L]
</IfModule>

把index.html的静态资源路径改为wap相对绝对路径就可以加载静态文件了。
上面没有考虑默认主域名,如果只用上面的规则的话,主域名也会跳转到相关的目录,这样就要加以区分一下了,完整的代码如下:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

RewriteCond %{HTTP_HOST} ^URL$
RewriteRule ^(/)?$ wap/index.php [L]

RewriteCond %{HTTP_HOST} ^(wap.)?URL$
RewriteRule ^(/)?$ wap/index.html [L]
</IfModule>

经测试,这样就完整了。

phpweb通过sql语句批量修改

phpweb后台提供底部信息一键修改所有页面,但是在数据库中是保存了多处的,phpweb每个插件都有自己的别名,可以根据别名去找到对应的数据like匹配下去修改。例如“底部信息编辑区”,如下sql语句:
UPDATE pwn_base_plus SET body` = ‘修改后信息’ WHERE `plusname` LIKE ‘底部信息编辑区’ ;

Apache下通过伪静态配置跳转步骤

win下apache配置跳转步骤:

首先要检查下是否开启了伪静态组件,去httpd.conf检查下,具体步骤如下:

找到apache目录下的 http.conf文件 搜索 LoadModule rewrite_module modules/mod_rewrite.so
默认在前面是有个 # 号的,代表注释。需要把注释去掉,开启下伪静态模块,其次就可以配置伪静态规则了。

比如让127.0.0.1本地域名跳转到127.0.0.2域名下,在web根目录下新建文件.htaccess,默认win创建不了含有.的文件,可以百度查下用dos创建,或者复制一个。写入以下规则:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^127.0.0.1 [NC]
RewriteRule ^(.*) http://127.0.0.2/ [R=301,L]

保存后访问127.0.0.1会自动跳转到127.0.0.2,还有另一种方法是利用php的跳转函数header,后面跟个参数就行。
如果是绑定的多个域名都需要跳转,上面要用以下规则:

RewriteCond %{HTTP_HOST} ^域名1$ [OR]
RewriteCond %{HTTP_HOST} ^域名2$

php可导致安全问题的一些函数

php可导致安全问题的一些函数如下:
exec,passthru,popen,proc_open,shell_exec,system,phpinfo,assert,chroot,getcwd,scandir,delete,rmdir,rename,chgrp,chown,copy,file,eval

phpweb开源程序涉及到文件权限检查,服务器需要留住rmdir,chown,copy,file函数才可以上传图片文件,或者去掉权限检查函数。
以上函数最好是禁用了,让服务器更安全一些。

修改php.ini下的disable_functions
disable_functions = exec,passthru,popen,proc_open,shell_exec,system,phpinfo,assert,chroot,getcwd,scandir,delete,rmdir,rename,chgrp,chown,copy,file,eval
 

一个SEO搜索引擎蜘蛛抓取日志函数

获取搜索引擎抓取状态函数:

function get_naps_bot()
{
$useragent = strtolower($_SERVER['HTTP_USER_AGENT']);
if (strpos($useragent, 'googlebot') !== false){
return 'Googlebot';//谷歌
}
if (strpos($useragent, 'msnbot') !== false){
return 'MSNbot';//微软
}
if (strpos($useragent, 'slurp') !== false){
return 'Yahoobot';//雅虎
}
if (strpos($useragent, 'baiduspider') !== false){
return 'Baiduspider';//百度
}
if (strpos($useragent, 'sohu-search') !== false){
return 'Sohubot';//搜狐
}
if (strpos($useragent, 'yodaoBot') !== false){
return 'YodaoBot';//网易有道
}
if (strpos($useragent, 'sosospider') !== false){
return 'Sosospider';//搜搜
}
if (strpos($useragent, 'sogou web spider') !== false){
return 'Sogou web spider';//搜狗
}
if (strpos($useragent, '360spider') !== false){
return '360spider';//360搜索
}
if (strpos($useragent, 'robozilla') !== false){
return 'Robozilla';
}
return false;
}

通过调用上面函数,判断某一时间抓取了,则记录,一般直接生成文件即可,大网站需分析日志可存到关系型数据库中,另外如果想实时知道抓取日志,可以调用phpmailer类,只要有抓取则自动给自己发邮件,具体代码自己写去吧。
另外获取抓取状态可以通过addslashes($_SERVER[‘HTTP_REFERER’].$_SERVER[‘PHP_SELF’]);常量去记录。

php目录树读取文件创建修改和最后访问时间生成tree

php目录树读取文件创建修改和最后访问时间生成tree方便维护时取必要的参数看文件时间等等,代码如下:

<?php
error_reporting(E_ERROR);
function traverse($path = '.') {
$tree = $_SERVER["DOCUMENT_ROOT"]."/tree.html"; //写入tree文件路径
$current_dir = opendir($path); //opendir()返回一个目录句柄,失败返回false
while(($file = readdir($current_dir)) !== false) { //readdir()返回打开目录句柄中的一个条目
$sub_dir = $path . DIRECTORY_SEPARATOR . $file; //构建子目录路径
if($file == '.' || $file == '..') {
continue;
} else if(is_dir($sub_dir)) { //如果是目录,进行递归
$str1 = '目录: ' . $file . date("创建时间:Y-m-d H:i:s",filectime($path)) . date("修改时间:Y-m-d H:i:s",filemtime($path)) . date("最后访问时间:Y-m-d H:i:s",fileatime($path)) . '<br>';
file_put_contents($tree,$str1,FILE_APPEND);
traverse($sub_dir);
} else { //如果是文件,直接输出
$wenjian = $path . '/' . $file;
$str2 = '文件:' . $path . ': ' . $file . date("创建时间:Y-m-d H:i:s",filectime($wenjian )) . date("修改时间:Y-m-d H:i:s",filemtime($wenjian)) . date("最后访问时间:Y-m-d H:i:s",fileatime($wenjian)) . '<br>';
file_put_contents($tree,$str2,FILE_APPEND);
}
}

}

traverse($_SERVER["DOCUMENT_ROOT"]);
echo "<a href='tree.html'>查看目录树</a>";

phpweb伪静态页面注入修复

今天用360和网上提供的一个防注入和跨站漏洞文件修复phpweb注入漏洞,其实默认已经是修复了,但是360还是提示高危漏洞,要有正确输出才可以,字符串已经过滤了,应该提示路径暴露却提示高危phpweb伪静态页面注入漏洞,调用的核心文件加密了,改不了,只有另想他法了。看了下提交的$_GET只有key键值,把键值提取出来过滤下sql语句就好,另外也可以判断数据库中是否存在这条记录,以下是防护代码:

foreach ($_GET as $key => $value){
$id=str_replace("_html","",$key);
}

$getfilter="'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";

if(preg_match("/".$getfilter."/is",$id)==1){
die("有注入");
}
$sqlaq="select * from pwn_page where id=".$id;
$result = mysql_query($sqlaq);

if(!$result){
print "没有此条记录!";
exit;
}

php链接Mysql排查问题代码

wdcp后台被窝改了一个参数,安全模式开启了,开启后mysql奇怪的打不开了,而在wdcp中的phpmyadmin和wdcp都可以链接上mysql,3306端口开着的,mysql开启了,最终想了下修改了一个参数,然后改回来了就好了。
php链接mysql排错代码如下:

<?php
$conn = mysql_connect("localhost","username","password") or die("connect err: ".mysql_error());
echo "MySQL数据库成功!";
?>

微信公众平台申请开发者代码

微信公众平台申请开发者代码

<?php
define ( "TOKEN", "longyun55521" );   //这里是TOKEN与在微信公众平台填写的应该对应。当然这个可以随便写,相当于这里是密码,申请时候填写的是重复密码。
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
 
class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];        //随机字符串
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }
    private function checkSignature() {
      $signature = $_GET ["signature"];
      $timestamp = $_GET ["timestamp"];
      $nonce = $_GET ["nonce"];
      $token = TOKEN;
      $tmpArr = array (
            $token,
            $timestamp,
            $nonce
      );
      sort ( $tmpArr );
      $tmpStr = implode ( $tmpArr );
      $tmpStr = sha1 ( $tmpStr );
 
      if ($tmpStr == $signature) {
        return true;
      } else {
        return false;
      }
    }

}

然后把这个php文件上传到服务器,如果路径是http://www.0535code.com/Demo.php 那网址就要填写这个,即可通过开发者验证。