php中preg_match过滤URL非法参数程序

 更新时间:2016年11月25日 17:41  点击:1735
preg_match函数执行正则规则就可以过滤url中指定的一些字符了,下面来看一个url参数过程中由preg_match过滤一些字符的例子。

PHP开发中经常用到URL传递参数,对传递的参数要进行安全过滤,过滤URL中非法参数,这是php安全的一个细小的地方,却事关安全的大事。URL参数一般都是数字或者字母加上”-“或者”_”组成,参数带有其他的符号的都要进行过滤,以免带来安全问题。对URL传参进行非法字符过滤,用preg_match很容易判断非法的参数。

 代码如下 复制代码

if(!preg_match("/^[a-z0-9_\-]+$/i",$this->commentid))
    $this->_show_msg(L('illegal_parameters'));


这里$this->commentid就是从URL中$_GET方式传递过来的参数,接收URL$_GET方式传递的参数的时候也要进行处理,如:

 代码如下 复制代码

$this->commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ? trim(urldecode($_GET['commentid'])) : $this->_show_msg(L('illegal_parameters'));

PHP开发安全问题不容忽视,这些很细小的问题很简单就可以处理,但是容易倏忽。很多的漏洞都是从这里找到的。

正则过滤就是利用preg_replace执行替换指定的内容或进行preg_macth进行匹配进行判断,两种效果差不多我们来介绍前者。

非法的汉字会影响到显示甚至程序的执行,会出现一些意想不到的结果。所以我们需要过滤这些非法的汉字或字符。
代码如下

 代码如下 复制代码

function normalizeText($text, $length = null)
{
    $text = \Normalizer::normalize($text, \Normalizer::FORM_C);
    $text = preg_replace('/[^\p{L}\p{P}\p{N}\p{S}\p{Zs}]/u', "", $text);
    $text = preg_replace('/^\p{Z}*/u', "", $text);
    $text = preg_replace('/\p{Z}*$/u', "", $text);
    if ($length !== null) {
        $text = mb_substr($text, 0, $length, 'utf-8');
    }
    return $text;
}

php自带了很多函数可以直接过滤所有html标签了,但时我们是希望清除指定的html标签再保留另外一些html标签了,下面给各位整理了一个例子。

很多时候我们正则清除HTML标签但总希望保留其中一部分标签

用asp语言实现

 代码如下 复制代码

str="<a href=""a.htm"">a.htm</a><div>afefe</div>feaa<b>bbb</b> 

<a href=http://www.111cn.net id=""ggg"">ggg</a><abbr>测试</abbr>" 

Set re=new RegExp    

 re.IgnoreCase =true    

 re.Global=True    

 re.Pattern="(<(?!/?(a|p|b)(\s|>))[^>]*>)"    

 str=re.replace(str," ")    

 response.Write str  


那正则也可以用在其他语言里实现里实现

用php语言实现如下:

 代码如下 复制代码


$str='<a href="a.htm">a.htm</a><div>afefe</div>feaa<b>bbb</b><a href=http://www.baidu.com id="ggg">ggg</a><abbr>测试</abbr>'; 
echo preg_replace('/(<(?!\/?(a|p|b)(\s|\>))[^>]*>)/', '', $str);  
?> 

当然php有更简单的实现方法:

 代码如下 复制代码

$str='<a href="a.htm">a.htm</a><div>afefe</div>feaa<b>bbb</b

或者这样写

 代码如下 复制代码

/**
* @param $content
* @return mixed
* 过滤a标签保留内容
*/
public function delete_tags_a($content){
$content = preg_replace("#<a[^>]*>(.*?)</a>#is", "$1", $content);
return $content;
}

如果是标签的读取xml我们可以直接使用SimpleXMLElement或dom之类的进行读取xml文档了,但今天小编碰到的是不标准的xml文档了,下面一起来看使用正则的处理办法。

如果在你的程序中收到这样的字符串:

 代码如下 复制代码
<ReportList><ordIndex>1</ordIndex><ordLabNo>1942268</ordLabNo><arcItemId>134</arcItemId><ordItemDesc>产品1</ordItemDesc><Status>执行</Status><ordDate>2013-08-12</ordDate><reportStatus>报告已出</reportStatus><reportException>0</reportException></ReportList><ReportList><ordIndex>2</ordIndex><ordLabNo>19434368</ordLabNo><arcItemId>135</arcItemId><ordItemDesc>产品2</ordItemDesc><Status>执行</Status><ordDate>2013-05-12</ordDate><reportStatus>报告未出</reportStatus><reportException>0</reportException></ReportList>

那么,恭喜你,php中我们常用的几种方法
都不会生效,如:

 代码如下 复制代码

$array = (array)new SimpleXMLElement($xml_str);
$array = (array)simplexml_load_string($xml_str);
$array = json_decode(json_encode(simplexml_load_string($xml_str)),true); 都是返回 false

所以我们只能自己写个方法喽

代码如下:

 代码如下 复制代码
function parse_xml_to_array($xmlstr,$loopTag){
    $args = explode('</'.$loopTag.'>',$xmlstr);
    $returns = array();
    if($args){
        $reg = '/<(\w+)[^>]*>([\x00-\xFF]*)<\/\1>/';
        foreach($args as $item){
            $item = str_replace('<'.$loopTag.'>','',$item);
            if(preg_match_all($reg, $item, $matches)) {
               if(isset($matches[1]) && isset($matches[2])){
                   $returns[] = array_combine($matches[1],$matches[2]);
               }
            }
        }
    }
    unset($args);
    return $returns;
}
$arr = parse_xml_to_array($xml,'ReportList');
var_dump($arr);

继续浏览有关 的文章

今天在做一个功能时因为以前我们填写的内容中有数字与中文了,但现在改版了只要数字了,使用intval函数发现如果开头不是数字就是0了,所以只有使用正则了,下面来看过程。

在网上搜索到这个测试一下发现还可以,但是如果字符长度不d{4} 不定长就不行了

 代码如下 复制代码

function findNum($str=''){
 if(empty($str)){return '';}
 $reg='/(\d{4}(\.\d+)?)/is';//匹配数字的正则表达式
 preg_match_all($reg,$str,$result);
 if(is_array($result)&&!empty($result)&&!empty($result[1])&&!empty($result[1][0])){
  return $result[1][0];
 }
 return '';
}

后来又发现知道中有一个

 代码如下 复制代码

$str=trim($str);
 if (preg_match('|(\d+)|',$str,$r)) return $r[1];

发现这个可以获取任意连续长度的数字了,当然在网上还看到很多,但有一个可以了所以就没有再测试了。

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • cmd下过滤文件名称的两种方法

    这篇文章主要介绍了cmd下过滤文件名称的两种方法,需要的朋友可以参考下...2020-06-30
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • 微信小程序 网络请求(GET请求)详解

    这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • 微信小程序自定义tabbar组件

    这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
  • 微信小程序手势操作之单触摸点与多触摸点

    这篇文章主要介绍了微信小程序手势操作之单触摸点与多触摸点的相关资料,需要的朋友可以参考下...2017-03-13
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • 手把手教你uniapp和小程序分包(图文)

    本文主要介绍了手把手教你uniapp和小程序分包,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-02
  • 微信小程序实现canvas分享朋友圈海报

    这篇文章主要为大家详细介绍了微信小程序实现canvas分享朋友圈海报,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-21
  • 微信小程序 页面跳转传递值几种方法详解

    这篇文章主要介绍了微信小程序 页面跳转传递值几种方法详解的相关资料,需要的朋友可以参考下...2017-01-16
  • 微信小程序实现选择地址省市区三级联动

    这篇文章主要为大家详细介绍了微信小程序实现选择地址省市区三级联动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-21