php str_replace的替换漏洞


Posted in PHP onMarch 15, 2008

定义和用法
str_replace() 函数使用一个字符串替换字符串中的另一些字符。

语法
str_replace(find,replace,string,count)

参数 描述
find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。一个变量,对替换数进行计数。

提示和注释
注释:该函数对大小写敏感。请使用 str_ireplace() 执行对大小写不敏感的搜索。

注释:该函数是二进制安全的。

例子 1

<?php 
echo str_replace("world","John","Hello world!"); 
?>

输出:

Hello John!

例子 2
在本例中,我们将演示带有数组和 count 变量的 str_replace() 函数:

<?php 
$arr = array("blue","red","green","yellow"); 
print_r(str_replace("red","pink",$arr,$i)); 
echo "Replacements: $i"; 
?>

输出:
Array
(
[0] => blue
[1] => pink
[2] => green
[3] => yellow
)
Replacements: 1

例子 3

<?php 
$find = array("Hello","world"); 
$replace = array("B"); 
$arr = array("Hello","world","!"); 
print_r(str_replace($find,$replace,$arr)); 
?>

输出:

Array
(
[0] => B
[1] =>
[2] => !
)

漏洞相关函数:

<?php

$arr1 = Array( 
'http://img.3water.com/img/offer/29/24/70/20/29247020',
'http://img.3water.com/img/offer/29/24/70/20/29247020-1',
'http://img.3water.com/img/offer/29/24/70/20/29247020-2'
);
$arr2 = Array(
'http://localhost/root/ups/af48056fc4.jpg',
'http://localhost/root/ups/cf33240aa3.jpg',
'http://localhost/root/ups/c30e40419b.jpg'
);
$data = '
<img src="http://img.3water.com/img/offer/29/24/70/20/29247020"/>
<img src="http://img.3water.com/img/offer/29/24/70/20/29247020-1"/>
<img src="http://img.3water.com/img/offer/29/24/70/20/29247020-2"/>';
$data = str_replace($arr1,$arr2,$data);
var_dump($data);
?>

替换后的结果是:

string(169) "<img src="http://localhost/root/ups/af48056fc4.jpg"/><img src="http://localhost/root/ups/af48056fc4.jpg-1"/><img src="http://localhost/root/ups/af48056fc4.jpg-2"/>"str_replace 函数的声明大概是这样: str_replace($search, $replace, $input[,&$count]), 比如在对一个字符串进行替换操作, $input 就是源字符串(称为数据源). 这很不合理,因为它把数据源放在第3位, 而 str_pos, strtok, str_repeat 等等函数都是把数据源放在第1位.也就是说str_replace并没有替换掉数组中相对应的字符串,而是把数组中的第一个替换,然后把相同的字符串后多余的合并。

解决办法:
function strrplace($arr1,$arr2,$data){ 
if(is_array($arr1)) {  
foreach($arr1 as $key => $value)  {
   $data = str_replace_once($value, $arr2[$key], $data);
  } } 
return $data;
}
function str_replace_once($needle, $replace, $data) //替换第一次
{
$pos = strpos($data, $needle);
if ($pos === false) {
return $data; 
}
return substr_replace($data, $replace, $pos, strlen($needle));

PHP 相关文章推荐
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
Aug 22 PHP
PHP 实现类似js中alert() 提示框
Mar 18 PHP
php获取错误信息的方法
Jul 17 PHP
php+html5基于websocket实现聊天室的方法
Jul 17 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
Apr 15 PHP
laravel 事件/监听器实例代码
Apr 12 PHP
php面向对象程序设计中self与static的区别分析
May 21 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
PHP执行速率优化技巧小结
Mar 15 #PHP
请php正则走开
Mar 15 #PHP
可以在线执行PHP代码包装修正版
Mar 15 #PHP
PHP Token(令牌)设计
Mar 15 #PHP
php项目打包方法
Feb 18 #PHP
PHP4与PHP5的时间格式问题
Feb 17 #PHP
PHP5 面向对象程序设计
Feb 13 #PHP
You might like
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
前端微信支付js代码
2016/07/25 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
Javascript实现登录记住用户名和密码功能
2017/03/22 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
Python re模块介绍
2014/11/30 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
python unittest实现api自动化测试
2018/04/04 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
内衣营销方案
2014/03/15 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
小学语文课后反思精选
2014/04/25 职场文书
安装工程师岗位职责
2015/02/13 职场文书