分类目录归档:PHP

TokenCode,防止机器人模拟提交方式注册

最近一个朋友网站,使用短信注册验证+验证码。短信验证竟然也能被识别(搜索发现,现在有接收平台)。程序使用的国内最知名的那个商城系统。树大招风,估计有人专门谢了注册工具。
通过分析,发现注册工具直接调用的注册提交页面。每个会员注册网站访问日志记录只有三条,发送手机验证码、验证码、注册提交页面。
因为使用了默认了验证码,很容易识别,最简单的方式就是更换复杂的验证码脚本即可防止恶意注册。但是这样还有个非常严重的问题,如果同行恶意操作。随便填写手机号,发出几万个请求,几分钟就能完成。几千短信费用估计就进去了。交流再三,还是决定在短信验证码上做文章。
继续阅读

PHP分页(页码)函数

09年的时候写过一个ASP输出分页页面的函数,分享两个ASP分页(页码)函数(http://www.miaoqiyuan.cn/p/asp-yema-fenye)。在开发中,省了不少力气,今天在些一个php的分页(页码)函数,供以后工作用。和ASP版本的参数,函数名都一样。

<?php
  /*
    #函数:csPage
    #功能:返回页面列表
  */
  Function csPage($iPage,$aPage,$urlStart,$urlEnd){
  	$tmp = "";
    if($iPage == 1 && $aPage == 1){
      $tmp = "<strong> 1/1 </strong>";
    }else{
      if($iPage == 1){
        $tmp = "<span> |< </span><span> << </span>";
      }else{
        $tmp = '<a title="首页" href="' . $UrlStart . 1 . $urlEnd . '"> |< </a><a title="上一页" href="' . $UrlStart . ($iPage-1) . $urlEnd . '"> << </a>';
      }
      $tmp .= "<strong> " . $iPage . "/" . $aPage . " </strong>";
      if($iPage == $aPage){
      	$tmp .= '<span> >> </span><span> >| </span>';
      }else{
        $tmp .= '<a title="下一页" href="' . $urlStart . ($iPage+1) . $urlEnd .' "> >> </a><a title="尾页" href="' . $urlStart . $aPage . $urlEnd . '"> >| </a>';
      }
    }
    return $tmp;
  }
  ?>

PHP无限级分类函数

很早之前就想一套PHP无限级分类函数,供以后的项目用,今晚闲了无事,就写一个把。懒得动脑,就按以前的ASP无限级分类函数的思想写一个把。

  /*
    作者:苗启源(Miaoqiyuan.cn)
    函数:getCatagory
    功能:获得分类列表
    参数:cat_arr     -> 分类数组(Rscordset:id:分类编号,pid:上级分类,name:分类名称,childs:子分类)
          cat_pid     -> 上级分类编号
          cat_childs  -> 下级分类编号
          cat_select  -> 选择的分类
          cat_dir     -> 分类级别
    返回:返回分类列表(Option)
  */
  function getCatagory($cat_arr,$cat_pid,$cat_childs,$cat_select,$cat_dir,$format){
    if($cat_pid==0 && $format=="option"){
      echo '<option value="0">根目录</option>';
    }
    if(is_array($cat_arr)){
      foreach($cat_arr as $cat_id =>$cat){
        if($cat['pid'] == $cat_pid && strpos("," . $cat_childs . ",","," . $cat['id'] . ",") == 0){
        #if($cat['pid'] == $cat_pid){
          if($format == "option"){
            echo '<option value="'. $cat['id'] .'" '. (($cat_select == $cat['id'])?"selected":"") . '>' . $cat_dir . '┣ ' . $cat['name'] . '</option>';
          }else{
            #<li>{$cat.dir}┣<a href="?act=edt&id={$cat.id}&type=product">{$cat.name}</a></li>
            $tmp = $format;
            if(strpos($tmp,"{\$cat.dir}")>0)$tmp = str_replace("{\$cat.dir}",$cat_dir,$tmp);
            if(strpos($tmp,"{\$cat.id}")>0)$tmp = str_replace("{\$cat.id}",$cat['id'],$tmp);
            if(strpos($tmp,"{\$cat.pid}")>0)$tmp = str_replace("{\$cat.pid}",$cat['pid'],$tmp);
            if(strpos($tmp,"{\$cat.name}")>0)$tmp = str_replace("{\$cat.name}",$cat['name'],$tmp);
            if(strpos($tmp,"{\$cat.childs}")>0)$tmp = str_replace("{\$cat.childs}",$cat['childs'],$tmp);
            echo $tmp;
          }
          getCatagory($cat_arr,$cat['id'],$cat_childs,$cat_select,$cat_dir . "┃",$format);
        }
      }
    }
  }
  
  $cat_arr = Array(
    1 => Array(
      'id'     =>1,
      'pid'    =>0,
      'name'   =>'分类一',
      'childs' =>'1,2,3,4,5'
    ),
    2 => Array(
      'id'     =>2,
      'pid'    =>1,
      'name'   =>'分类二',
      'childs' =>'2,5'
    ),
    3 => Array(
      'id'     =>3,
      'pid'    =>1,
      'name'   =>'分类4',
      'childs' =>'3,4'
    ),
    4 => Array(
      'id'     =>4,
      'pid'    =>3,
      'name'   =>'分类4',
      'childs' =>'4'
    ),
    5 => Array(
      'id'     =>5,
      'pid'    =>2,
      'name'   =>'分类5',
      'childs' =>'5'
    )
  );
  
  getCatagory($cat_arr,0,'','','','<li>{$cat.dir}┣<a href="?act=edt&id={$cat.id}&type=product">{$cat.name}</a></li>');

关于模板的一些思考

现在php的项目,动不动就smarty。甚至有的朋友做个两三个页面的新闻系统,也要用smarty。今天按捺不做,谢谢我的看法。本文原文地址为:http://www.miaoqiyuan.cn/p/template-thinks,希望转贴的朋友留一个我的链接。
做个新闻系统,不用smarty,10KB以内的代码搞定,如果用smarty后,就要几百KB了。有些人可能会说不用模板,修改的时候不方便,或则需要每篇文章使用不同的模板,直接用php代码,就不好控制了,在这里给我大家分享一套另类的模板方法。

<?php
  #init.php
  #获取皮肤设置,如果不存在,则调用default.php
 $skin = trim($_GET['skin']);
  if(!isset($skin) || @$skin==''){
    $skin = 'skin/default.php';
  }else{
    $skin = 'skin/'.$skin.'.php';
    if(!is_file($skin)){
      $skin = 'skin/default.php';
    }
  }
?>

数据处理文件

<?php
   include("inc/init.php");
   #其他数据处理,把所有的数据,用变量或数组保存
  ...
   $title = "1111";
   $newlist = Array(
     Array("111"),
     Array("222"),
     Array("333")
   );
   #引用模板文件
  require($skin);
?>

模板文件:default.php

<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8">
<title><?php echo $title?></title>
</head>
<body>
<?php foreach($newslist as $id => $item){?>
<li><?php echo $item['title'];?></li>
<?php }?>
</body>
</html>
?>

模板文件:skin2.php

<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8">
<title><?php echo $title?></title>
</head>
<body>
<table>
<?php foreach($newslist as $id => $item){?>
<tr><td><?php echo $item['title'];?></td></tr>
<?php }?>
</table>
</body>
</html>
?>

PHP写的FTP猜解工具

最近,使用公司虚拟主机的客户老是抱怨网站被挂马,服务器安全方面我认为是没有问题的,问题只有可能出现在ftp上。查看服务器日志,果然没错,近期有大量的ftp登录失败的日志。
原因找到了,看看到底是那些空间出现了问题。于是模仿攻击这的方式,用php写的ftp猜解工具,今天测试了一下,结果让人触目惊心啊。考虑再三,本工具还是一改我往常的作风,不公开源代码了,原因嘛~太危险了,本工具一个小时能检测1800(我测试的服务器机房线路比较好,所以速度很快)个站点左右,出现安全隐患的竟然能达到300个站点左右,出现问题的站点竟然能占到1/6,如果被非法份子利用,跑10个小时,可能就有3000个站点遭殃了。
简单说一下功能,php 5.0开发的,
1、首先载入页面框架,提示输入一个域名
2、得到该服务器上的站点,调用myip.cn上的同服务器站点,返回列表。使用了easytemplate框架。
3、根据2的列表,依次执行猜解工作。每次猜解完一条信息,通过ajax返回工作进度,暂停0.5秒继续猜解。

猜解字典可自定义,一下密码均可被猜出:
同FTP名
域名去掉.(比如域名:www.baidu.com 密码为wwwbaiducom,baiducom)
123,1234,12345,123456,1234567,12345678,123456789,5201314,1314520,987654321,54321,88888888,000,0000,001,002,007,008,10th,1st,2nd,3rd,4th,5th,6th,7th,8th,9th,100,101,108,133,163,166,188,233,266,350,366,450,466,136,137,138,139,158,168,169,192,198,200,222,233,234,258,288,300,301,333,345,388,400,433,456,458,500,555,558,588,600,666,598,668,678,688,888,988,999,1088,1100,1188,1288,1388,1588,1688,1888,1949,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1997,1999,2000,2001,2002,2088,2100,2188,2345,2588,3000,3721,3888,4567,4728,5555,5678,5888,6666,6688,6789,6888,7788,8888,8899,9988,9999,23456,34567,45678,88888,654321,888888,6666,56789,1234567,12345678,737,777,1111,2222,3333,4321,computer,cpu,memory,disk,soft,y2k,software,cdrom,rom,admin,master,card,pci,lock,ascii,knight,creative,modem,internet,intranet,web,www,isp,unlock,ftp,telnet,ibm,intel,microsoft,dell,compaq,toshiba,acer,info,aol,56k,server,dos,windows,win95,win98,office,word,excel,access,unix,linux,password,file,program,mp3,mpeg,jpeg,gif,bmp,billgates,chip,silicon,sony,link,word97,office97,network,ram,sun,yahoo,excite,hotmail,yeah,sina,pcweek,mac,apple,robot,key,monitor,win2000,office2000,word2000,net,virus,company,tech,technology,print,coolweb,guest,printer,superman,hotpage,enter,myweb,download,cool,coolman,coolboy,coolgirl,netboy,netgirl,log,login,connect,email,hyperlink,url,hotweb,java,cgi,html,htm,home,homepage,icq,mykey,c++,basic,delphi,pascal,anonymous,crack,hack,hacker,chinese,vcd,chat,chatroom,mud,cracker,happy,hello,room,english,user,netizen,frontpage,agp,netwolf,usa,hot,site,address,mail,news,topcool

使用php加密、压缩Javascript脚本

又好久没有更新日志了,上次谈到将工作用的脚本换成php,现在发现这是一个非常非常明智的选择。
在Linux也可以直接用php当作脚本,处理工作的事情。也算是“跨平台脚本”咯~~~
今天说一下JS压缩,呵呵,这种工具我可写不出来,但是网上牛人已经帮我们写出了相应的类:JavaScriptPacker(http://creativecommons.org/licenses/LGPL/2.1/)
我们直接调用就可以咯,比如将test_resource.js压缩成test.js。

<?php
   #demo.php
   require_once 'class.JavaScriptPacker.php';
   $packer = new JavaScriptPacker(file_get_contents("./test_resource.js"), 'Normal', true, false);
   file_put_contents("./test.js",$packer->pack());
?>

直接 php demo.php