PHP7 preg_replace 出错及解决办法

问题描述:

PHP7废弃了preg_replace?

原本是中php5中处理url中后面参数替换清除的,代码如下

$url = preg_replace('/([?&])src=[^&]+(&?)/e', '"$2"==""?"":"$1"', $url);

但是到php7中就报错了

需要用preg_replace_callback来替换,请问该咋办?

相关代码

$url = preg_replace('/([?&])src=[^&]+(&?)/e', '"$2"==""?"":"$1"', $url);

问题分析:

e 修饰符因为存在安全隐患 自 5.3 开始就已经标记为了待移除的内容。

转而接替的是 preg_replace_callback,此方法第二个参数为一个回调函数,回调函数会自动传入比配的分组作为参数。在回调函数内部通过数组下标访问匹配组。(手机码字 未格式化代码)

preg_replace_callback('/([?&])src=[^&]+(&?)/', function($matches){
    return $matches[2]==""?"":$matches[1];
}, $url);

知识点扩展:

PHP7已经删除了preg_replace的e修饰符

官网提示是这样的,对/e修饰符的支持已删除。请改用preg_replace_callback()

原因是/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后),会被一句话后门使用

看看smarty中是也是这样用的,也是存在问题

$source_content = preg_replace($search.'e', "'"
. $this->_quote_replace($this->left_delimiter) . 'php'
. "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
. $this->_quote_replace($this->right_delimiter)
. "'"
, $source_content);
可以把smarty模板修改成这个
$source_content = preg_replace_callback($search, function ($matches){
$str="";
$str.=$this->_quote_replace($this->left_delimiter) . 'php';
$str.=str_repeat("\\n\\", substr_count($matches[1], "\\n\\"));
$str.=$this->_quote_replace($this->right_delimiter);
return $str;
}, $source_content);

到此这篇关于PHP7 preg_replace 出错及解决办法的文章就介绍到这了,更多相关PHP7 preg_replace 使用出错内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PHP中一个有趣的preg_replace函数详解

    0x01 起因 事情的起因是下午遇到了 preg_replace 函数,我们都知道 preg_replace 函数可能会导致命令执行.现在我们来一些情况. 0x02 经过 踩坑1: 测试代码大概是这样的: foreach ($_GET as $regex => $value) { preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value); } 测试过程中发现通过浏览器的方式传入数据的时候,会将 . + 等特殊字

  • PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析

    本文实例讲述了PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法.分享给大家供大家参考,具体如下: 环境错误级别:error_reporting =E_ALL 某天我在研究一下php下的正则替换函数perg_replace(), 示例: 代码: $subject="2222<b>a</b>2222fff222222222A22222"; $pattern = "/(a)/e&q

  • 深入研究PHP中的preg_replace和代码执行

    前言 本文将深入研究 preg_replace /e 模式下的代码执行问题,其中包括 preg_replace 函数的执行过程分析.正则表达式分析.漏洞触发分析,当中的坑非常多,相信看完本文,你一定会有所收获.下面是 七月火 和 l1nk3r 的分析结果. 案例 下面先看一个案例,思考如何利用此处的 preg_replace /e 模式,执行代码(可以先不看下文分析,自己思考出 payload 试试). 这个案例实际上很简单,就是 preg_replace 使用了 /e 模式,导致可以代码执行,

  • PHP正则表达式函数preg_replace用法实例分析

    本文实例讲述了PHP正则表达式函数preg_replace用法.分享给大家供大家参考,具体如下: preg_replace 执行一个正则表达式的搜索和替换 语法:preg_replace (pattern ,replacement ,subject,limit,count ) 参数 描述 pattern 正则表达式(字符串或字符串数组) replacement 用于替换的字符串或字符串数组 subject 要进行搜索和替换的字符串或字符串数组. limit 可选.每个模式在每个subject上进

  • PHP7 preg_replace 出错及解决办法

    问题描述: PHP7废弃了preg_replace? 原本是中php5中处理url中后面参数替换清除的,代码如下 $url = preg_replace('/([?&])src=[^&]+(&?)/e', '"$2"==""?"":"$1"', $url); 但是到php7中就报错了 需要用preg_replace_callback来替换,请问该咋办? 相关代码 $url = preg_replace(

  • Python 爬虫之超链接 url中含有中文出错及解决办法

    Python 爬虫之超链接 url中含有中文出错及解决办法 python3.5 爬虫错误: UnicodeEncodeError: 'ascii' codec can't encode characters 这个错误是由于超链接中含有中文引起的,超链接默认是用ascii编码的,所以不能直接出现中文,若要出现中文, 解决方法如下: import urllib from urllib.request import urlopen link="http://list.jd.com/list.html?

  • 浅谈Maven安装及环境配置出错的解决办法

    可能导致安装不成功的原因: 添加 系统变量的时候,M2_HOME路径没有在尾部加上\bin,而是把\bin在PATH路径的尾部加上了,比如下图某教程教的,这样做可能导致环境变量配置不成功. 安装和环境配置步骤 一.准备工作 1.jdk7.0以上版本 2.win10操作系统 3.maven安装包 二.解压安装包到指定文件夹 我的安装包解压到了C:\WorkSoftware\apache-maven-3.5.2 三.配置环境变量 C:\WorkSoftware\apache-maven-3.5.2

  • 有星外虚拟主机管理系统下MSSQL2005服务器因重装改名后出错的解决办法

    出错信息为: "sys.servers 中找不到服务器 'BBB'.请验证指定的服务器名称是否正确.如果需要,请执行存储过程 sp_addlinkedserver 以将服务器添加到 sys.servers." 或为: "此游标不包括正在修改的表,或该表不能通过此游标更新. " 原因是因为装系统后改过计算机的名称,原来的名称是"AAA",新的计算机名是"BBB" 解决方法: 第一步: 打开SQL Server Managemen

  • Android中 webView调用JS出错的解决办法

    问题 webView调用JS出错. 复制代码 代码如下: class TestJS {         ......         public TestJS(){         }                 public void save(String data){                        webView.loadUrl("javascript: alert(" + data +")");         }         ..

  • 详解.NET Core 使用HttpClient SSL请求出错的解决办法

    问题 使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常,并且证书已经传入. 下面就是问题代码: public class Program { public static void Main(string[] args) { var url = @"https://xxx.xxx.xxx.xxx:xxxx/xxx-web/se

  • Asp.net Core 1.1 升级后操作mysql出错的解决办法

    遇到问题 core的版本从1.0升级到1.1,操作mysql数据库,查询数据时遇到MissingMethodException问题,更新.插入操作没有问题. 如果你也遇到这个问题,请参照以下步骤进行升级操作. 操作步骤及内容 如果你的项目已经引用过以下几部分内容,请依次升级内容: PM> Update-Package Microsoft.EntityFrameworkCore PM> Update-Package Microsoft.EntityFrameworkCore.SqlServer

  • windows下写的shell脚本在linux执行出错的解决办法

    在Windows下写了一个shell脚本,上传到Linux下执行时报错: 复制代码 代码如下: [root@localhost test]# ./test.sh   -bash: ./test.sh: /bin/sh^M: bad interpreter: No such file or directory test.sh源码:  复制代码 代码如下: #!/bin/sh echo "test shell " 由于自己对shell不太熟悉,找同事沟通了后了解了原委,主要原因是test.

  • nginx上传文件大小报错500的解决办法

    nginx上传文件大小报错500的解决办法 采用nginx作反向代理,出现了一个诡异的问题,小文件可以提交,大文件会报500内部错误.这个是什么原因导致的呢? 查wiki可知,上传文件大小相关的有三个配置 client_body_buffer_size 配置请求体缓存区大小, 不配的话, client_body_temp_path 设置临时文件存放路径.只有当上传的请求体超出缓存区大小时,才会写到临时文件中 client_max_body_size 设置上传文件的最大值 所以查出来,问题出现的原

  • docker.service启动失败:Unit not found的原因及解决办法

    背景 因为最近一直在折腾Kubernetes集群版本升级.Docker版本升级,所以不停的把测试环境安装.还原.升级.降级,简直乱的不行.终于,在测试Docker版本升级后,启动Docker时,遇到了docker.service: Unit not found.问题虽然不大,但是却折磨了我几个小时,所以在此mark一下. 操作系统:Red Hat Enterprise Linux 7 原因1:docker.socket 最初在启动docker时遇到问题,是因为docker.socket引起的,虽

随机推荐