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 相关文章推荐
php5中类的学习
Mar 28 PHP
PHP与C#分别格式化文件大小的代码
May 14 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
Apr 28 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
php发送post请求的三种方法
Feb 11 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
Nov 05 PHP
实例简介PHP的一些高级面向对象编程的特性
Nov 27 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
PHP编译configure时常见错误的总结
Aug 17 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随机数生成代码与使用实例分析
2011/04/08 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Python中内置的日志模块logging用法详解
2016/07/12 Python
深入浅析python的第三方库pandas
2020/02/13 Python
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
幼儿园元旦活动感言
2014/03/02 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
三好学生评语大全
2014/12/29 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
《去年的树》教学反思
2016/02/18 职场文书
Python实现Hash算法
2022/03/18 Python