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中的 == 运算符进行字符串比较
Nov 26 PHP
详解PHP显示MySQL数据的三种方法
Jun 05 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
May 09 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
php实现产品加入购物车功能(1)
Jul 23 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
php精度计算的问题解析
Jun 21 PHP
php获取微信openid方法总结
Oct 10 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显示MySQL数据的三种方法
2008/06/05 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
基于python的Paxos算法实现
2019/07/03 Python
python数值基础知识浅析
2019/11/19 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
Python 创建TCP服务器的方法
2020/07/28 Python
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
优秀员工表扬信
2014/01/17 职场文书
干部现实表现材料
2014/02/13 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
拔河比赛口号
2014/06/10 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书